Java jaxb:防止创建冗余集合?
我使用JAXB生成用于解析XML文件的Java代码,每当XML中重复出现元素时,生成的类都会通过单独类中的集合包含额外级别的间接寻址,这对我来说似乎是多余的,并使使用这些类的代码有点不雅。为了说明我的意思,假设我的XML文件如下所示:Java jaxb:防止创建冗余集合?,java,xml,jaxb,Java,Xml,Jaxb,我使用JAXB生成用于解析XML文件的Java代码,每当XML中重复出现元素时,生成的类都会通过单独类中的集合包含额外级别的间接寻址,这对我来说似乎是多余的,并使使用这些类的代码有点不雅。为了说明我的意思,假设我的XML文件如下所示: <?xml version="1.0" encoding="utf-8"?> <configuration> <columns> <column id="c1"> &l
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<columns>
<column id="c1">
<order>1</order>
<name>first</name>
<type>text</type>
</column>
<column id="c2">
<order>2</order>
<name>second</name>
<type>text</type>
</column>
<column id="c3">
<order>3</order>
<name>third</name>
<type>text</type>
</column>
</column>
</columns>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="configuration" type="Configuration"/>
<xs:complexType name="ColumnList">
<xs:sequence>
<xs:element type="Column" name="column" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Column">
<xs:sequence>
<xs:element type="xs:integer" name="order"/>
<xs:element type="xs:string" name="name"/>
<xs:element name="type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="number"/>
<xs:enumeration value="date"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="format" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="id"/>
<xs:attribute type="xs:boolean" name="optional" use="optional"/>
</xs:complexType>
</xs:schema>
专栏列表只是
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ColumnList", propOrder = {
"column"
})
public class ColumnList {
protected List<Column> column;
// ...
}
@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=“ColumnList”,proporter={
“栏目”
})
公共类专栏列表{
受保护列表列;
// ...
}
这使得访问列有点笨拙,因为我总是要执行类似于config.getColumns().getColumn()
的操作
所以我的问题是:有没有办法告诉JAXB省略这个额外的间接层次?与其创建只包含列表的ColumnList
类型,不如在Configuration
类中使用List
,这样我就可以编写List=config.getColumns()代码>
模式定义在我的控制之下,因此更改它是没有问题的,但我怀疑仅此一项是不够的。我怀疑指定显式JAXB绑定可能会起作用,但我不确定如何做到这一点。您可以省略列列表
类型,并指定配置
以拥有一个名为列的列
元素集合。
生成的代码不应再具有ColumnList类,也不应具有额外级别的间接寻址
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="configuration" type="Configuration">
<xs:complexType>
<xs:sequence>
<xs:element type="Column" name="columns" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Column">
<xs:sequence>
<xs:element type="xs:integer" name="order"/>
<xs:element type="xs:string" name="name"/>
<xs:element name="type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="number"/>
<xs:enumeration value="date"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="format" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="id"/>
<xs:attribute type="xs:boolean" name="optional" use="optional"/>
</xs:complexType>
</xs:schema>
但如果我没有弄错的话,这意味着改变XML的结构,使列
元素不再包含在列
父元素中-它们只是与配置
元素中的其他元素集中在同一级别上(在我的例子中有更多的类型,我只是为了简洁而省略了它们)。这是一个我更愿意避免的更改,因为我认为将相同类型的元素放在一个子元素中可以使XML更易于阅读。是的,这意味着更改XML的结构。遗憾的是,我没有保留父元素(包装器)的经验元素,但不包括在生成的代码中。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="configuration" type="Configuration">
<xs:complexType>
<xs:sequence>
<xs:element type="Column" name="columns" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Column">
<xs:sequence>
<xs:element type="xs:integer" name="order"/>
<xs:element type="xs:string" name="name"/>
<xs:element name="type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="number"/>
<xs:enumeration value="date"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element type="xs:string" name="format" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:string" name="id"/>
<xs:attribute type="xs:boolean" name="optional" use="optional"/>
</xs:complexType>
</xs:schema>