Java jaxb:防止创建冗余集合?

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

我使用JAXB生成用于解析XML文件的Java代码,每当XML中重复出现元素时,生成的类都会通过单独类中的集合包含额外级别的间接寻址,这对我来说似乎是多余的,并使使用这些类的代码有点不雅。为了说明我的意思,假设我的XML文件如下所示:

<?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>