是否可以使用 JAXB 注释生成具有属性组的模式?如果是这样,怎么做?如果不是,为什么不呢?
问问题
456 次
1 回答
1
TL;博士
JAXB (JSR-222)没有定义将属性组输出到生成的模式的方法。
从 XML 模式开始
下面是一个示例 XML 模式,其中包含两个引用相同属性组的复杂类型。
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/schema"
xmlns:tns="http://www.example.org/schema"
elementFormDefault="qualified">
<attributeGroup name="my-attribute-group">
<attribute name="att1" type="string"/>
<attribute name="att2" type="int"/>
</attributeGroup>
<complexType name="foo">
<attributeGroup ref="tns:my-attribute-group"/>
<attribute name="foo-att" type="string"/>
</complexType>
<complexType name="bar">
<attributeGroup ref="tns:my-attribute-group"/>
<attribute name="bar-att" type="string"/>
</complexType>
</schema>
生成模型
在下面生成的类中,我们看到属性组中的属性与复杂类型中定义的属性的处理方式相同。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo")
public class Foo {
@XmlAttribute(name = "foo-att")
protected String fooAtt;
@XmlAttribute(name = "att1")
protected String att1;
@XmlAttribute(name = "att2")
protected Integer att2;
}
和
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "bar")
public class Bar {
@XmlAttribute(name = "bar-att")
protected String barAtt;
@XmlAttribute(name = "att1")
protected String att1;
@XmlAttribute(name = "att2")
protected Integer att2;
}
从 Java 类开始
如果不是,为什么不呢?
现在我们知道属性组中的属性的处理方式与常规属性相同,因此需要额外的元数据来表明它们是同一属性组的一部分。需要注意确保随着Foo
和Bar
类的演变,同一属性组的不同定义不会随着时间的推移而分歧,从而导致错误。由于相同的 XML 文档可以由具有或不具有属性组的 XML 模式表示,因此 JAXB 选择了更简单且不易出错的选项,即不提供生成它们的标准方法。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo")
public class Foo {
@XmlAttribute(name = "foo-att")
protected String fooAtt;
@XmlAttribute(name = "att1", fictionalPropertyAttributeGroup="my-attribute-group")
protected String att1;
@XmlAttribute(name = "att2", fictionalPropertyAttributeGroup="my-attribute-group")
protected Integer att2;
}
和
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "bar")
public class Bar {
@XmlAttribute(name = "bar-att")
protected String barAtt;
@XmlAttribute(name = "att1", fictionalPropertyAttributeGroup="my-attribute-group")
protected String att1;
@XmlAttribute(name = "att2", fictionalPropertyAttributeGroup="my-attribute-group")
protected Integer att2;
}
于 2013-07-30T14:06:08.023 回答