3

是否可以使用 JAXB 注释生成具有属性组的模式?如果是这样,怎么做?如果不是,为什么不呢?

4

1 回答 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 类开始

如果不是,为什么不呢?

现在我们知道属性组中的属性的处理方式与常规属性相同,因此需要额外的元数据来表明它们是同一属性组的一部分。需要注意确保随着FooBar类的演变,同一属性组的不同定义不会随着时间的推移而分歧,从而导致错误。由于相同的 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 回答