如何让 JAXB 仅限定元素而不限定属性?
我有以下内容,它是具有给定前缀的正确限定元素。但是,它还使用该前缀限定属性,这不是必需的。
@XmlSchema(xmlns = {@XmlNs(namespaceURI = "http://www.w3.org/2005/Atom", prefix = "atom") }, elementFormDefault = XmlNsForm.QUALIFIED, attributeFormDefault = XmlNsForm.UNSET)
它产生了这个:
<atom:link atom:rel="self" atom:href="/accounts/123456XZ" atom:type="application/xml"></atom:link>
我已经尝试过 XmlNsForm.UNSET 和 UNQUALIFIED,并且都具有相同的结果。
我想要的是这样的:
<atom:link rel="self" href="/accounts/123456XZ" type="application/xml"></atom:link>
这是有问题的类,由 XJC 从 XSD 生成:
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.6
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2013.08.19 at 12:28:23 PM BST
//
package org.w3._2005.atom;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.namespace.QName;
import net.karneim.pojobuilder.GeneratePojoBuilder;
import org.jvnet.jaxb2_commons.lang.Equals;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;
/**
*
* The Atom link construct is defined in section 3.4 of the format spec.
*
*
* <p>Java class for linkType complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="linkType">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <attGroup ref="{http://www.w3.org/2005/Atom}commonAttributes"/>
* <attribute name="rel" type="{http://www.w3.org/2001/XMLSchema}string" />
* <attribute name="href" use="required" type="{http://www.w3.org/2001/XMLSchema}anyURI" />
* <attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
* <attribute name="hreflang" type="{http://www.w3.org/2001/XMLSchema}NMTOKEN" />
* <attribute name="title" type="{http://www.w3.org/2001/XMLSchema}string" />
* <attribute name="length" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />
* <anyAttribute namespace='##other'/>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "linkType", propOrder = {
"content"
})
@GeneratePojoBuilder
public class LinkType
implements Equals, ToString
{
@XmlValue
protected String content;
@XmlAttribute(name = "rel")
protected String rel;
@XmlAttribute(name = "href", required = true)
@XmlSchemaType(name = "anyURI")
protected String href;
@XmlAttribute(name = "type")
protected String type;
@XmlAttribute(name = "hreflang")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NMTOKEN")
protected String hreflang;
@XmlAttribute(name = "title")
protected String title;
@XmlAttribute(name = "length")
@XmlSchemaType(name = "positiveInteger")
protected BigInteger length;
@XmlAttribute(name = "base", namespace = "http://www.w3.org/XML/1998/namespace")
@XmlSchemaType(name = "anyURI")
protected String base;
@XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "language")
protected String lang;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();
/**
*
* The Atom link construct is defined in section 3.4 of the format spec.
*
*
* @return
* possible object is
* {@link String }
*
*/
public String getContent() {
return content;
}
/**
* Sets the value of the content property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setContent(String value) {
this.content = value;
}
/**
* Gets the value of the rel property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getRel() {
return rel;
}
/**
* Sets the value of the rel property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setRel(String value) {
this.rel = value;
}
/**
* Gets the value of the href property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getHref() {
return href;
}
/**
* Sets the value of the href property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setHref(String value) {
this.href = value;
}
/**
* Gets the value of the type property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getType() {
return type;
}
/**
* Sets the value of the type property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setType(String value) {
this.type = value;
}
/**
* Gets the value of the hreflang property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getHreflang() {
return hreflang;
}
/**
* Sets the value of the hreflang property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setHreflang(String value) {
this.hreflang = value;
}
/**
* Gets the value of the title property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getTitle() {
return title;
}
/**
* Sets the value of the title property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setTitle(String value) {
this.title = value;
}
/**
* Gets the value of the length property.
*
* @return
* possible object is
* {@link BigInteger }
*
*/
public BigInteger getLength() {
return length;
}
/**
* Sets the value of the length property.
*
* @param value
* allowed object is
* {@link BigInteger }
*
*/
public void setLength(BigInteger value) {
this.length = value;
}
/**
* Gets the value of the base property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getBase() {
return base;
}
/**
* Sets the value of the base property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setBase(String value) {
this.base = value;
}
/**
* Gets the value of the lang property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLang() {
return lang;
}
/**
* Sets the value of the lang property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLang(String value) {
this.lang = value;
}
/**
* Gets a map that contains attributes that aren't bound to any typed property on this class.
*
* <p>
* the map is keyed by the name of the attribute and
* the value is the string value of the attribute.
*
* the map returned by this method is live, and you can add new attribute
* by updating the map directly. Because of this design, there's no setter.
*
*
* @return
* always non-null
*/
public Map<QName, String> getOtherAttributes() {
return otherAttributes;
}
public String toString() {
final ToStringStrategy strategy = JAXBToStringStrategy.INSTANCE;
final StringBuilder buffer = new StringBuilder();
append(null, buffer, strategy);
return buffer.toString();
}
public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy strategy) {
strategy.appendStart(locator, this, buffer);
appendFields(locator, buffer, strategy);
strategy.appendEnd(locator, this, buffer);
return buffer;
}
public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy strategy) {
{
String theContent;
theContent = this.getContent();
strategy.appendField(locator, this, "content", buffer, theContent);
}
{
String theRel;
theRel = this.getRel();
strategy.appendField(locator, this, "rel", buffer, theRel);
}
{
String theHref;
theHref = this.getHref();
strategy.appendField(locator, this, "href", buffer, theHref);
}
{
String theType;
theType = this.getType();
strategy.appendField(locator, this, "type", buffer, theType);
}
{
String theHreflang;
theHreflang = this.getHreflang();
strategy.appendField(locator, this, "hreflang", buffer, theHreflang);
}
{
String theTitle;
theTitle = this.getTitle();
strategy.appendField(locator, this, "title", buffer, theTitle);
}
{
BigInteger theLength;
theLength = this.getLength();
strategy.appendField(locator, this, "length", buffer, theLength);
}
{
String theBase;
theBase = this.getBase();
strategy.appendField(locator, this, "base", buffer, theBase);
}
{
String theLang;
theLang = this.getLang();
strategy.appendField(locator, this, "lang", buffer, theLang);
}
return buffer;
}
public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy strategy) {
if (!(object instanceof LinkType)) {
return false;
}
if (this == object) {
return true;
}
final LinkType that = ((LinkType) object);
{
String lhsContent;
lhsContent = this.getContent();
String rhsContent;
rhsContent = that.getContent();
if (!strategy.equals(LocatorUtils.property(thisLocator, "content", lhsContent), LocatorUtils.property(thatLocator, "content", rhsContent), lhsContent, rhsContent)) {
return false;
}
}
{
String lhsRel;
lhsRel = this.getRel();
String rhsRel;
rhsRel = that.getRel();
if (!strategy.equals(LocatorUtils.property(thisLocator, "rel", lhsRel), LocatorUtils.property(thatLocator, "rel", rhsRel), lhsRel, rhsRel)) {
return false;
}
}
{
String lhsHref;
lhsHref = this.getHref();
String rhsHref;
rhsHref = that.getHref();
if (!strategy.equals(LocatorUtils.property(thisLocator, "href", lhsHref), LocatorUtils.property(thatLocator, "href", rhsHref), lhsHref, rhsHref)) {
return false;
}
}
{
String lhsType;
lhsType = this.getType();
String rhsType;
rhsType = that.getType();
if (!strategy.equals(LocatorUtils.property(thisLocator, "type", lhsType), LocatorUtils.property(thatLocator, "type", rhsType), lhsType, rhsType)) {
return false;
}
}
{
String lhsHreflang;
lhsHreflang = this.getHreflang();
String rhsHreflang;
rhsHreflang = that.getHreflang();
if (!strategy.equals(LocatorUtils.property(thisLocator, "hreflang", lhsHreflang), LocatorUtils.property(thatLocator, "hreflang", rhsHreflang), lhsHreflang, rhsHreflang)) {
return false;
}
}
{
String lhsTitle;
lhsTitle = this.getTitle();
String rhsTitle;
rhsTitle = that.getTitle();
if (!strategy.equals(LocatorUtils.property(thisLocator, "title", lhsTitle), LocatorUtils.property(thatLocator, "title", rhsTitle), lhsTitle, rhsTitle)) {
return false;
}
}
{
BigInteger lhsLength;
lhsLength = this.getLength();
BigInteger rhsLength;
rhsLength = that.getLength();
if (!strategy.equals(LocatorUtils.property(thisLocator, "length", lhsLength), LocatorUtils.property(thatLocator, "length", rhsLength), lhsLength, rhsLength)) {
return false;
}
}
{
String lhsBase;
lhsBase = this.getBase();
String rhsBase;
rhsBase = that.getBase();
if (!strategy.equals(LocatorUtils.property(thisLocator, "base", lhsBase), LocatorUtils.property(thatLocator, "base", rhsBase), lhsBase, rhsBase)) {
return false;
}
}
{
String lhsLang;
lhsLang = this.getLang();
String rhsLang;
rhsLang = that.getLang();
if (!strategy.equals(LocatorUtils.property(thisLocator, "lang", lhsLang), LocatorUtils.property(thatLocator, "lang", rhsLang), lhsLang, rhsLang)) {
return false;
}
}
return true;
}
public boolean equals(Object object) {
final EqualsStrategy strategy = JAXBEqualsStrategy.INSTANCE;
return equals(null, null, object, strategy);
}
}