JAXB List Tag创建内部类

Jim*_*Jim 12 java jaxb xjc

所以我们在表单中有一个XSD类型:

<xs:complexType name="Foo">
    <xs:all>
        <xs:element name="Bars">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="Bar" type="barType" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:all>
</xs:complexType>    
Run Code Online (Sandbox Code Playgroud)

表示XML:

<Foo>
    <!-- Elements snipped for brevity-->
    <Bars>
        <Bar>
            <!-- Bar Element -->
        </Bar>
    </Bars>
</Foo>
Run Code Online (Sandbox Code Playgroud)

xjc产生几乎正确的结果.唯一令人讨厌的事情是"Bars"被创建为一个内部类,它存储一个Bars列表.反正有没有Bars在Foo中成为List而仍然保留上面的XML?

pad*_*dis 6

将Bars定义为复杂类型时,Bars将作为分隔的类生成.像这样我发现架构也更容易阅读.除非你将maxOccurs更改为大于1的值,否则Bars不会是Foo中的List - 你不能在xs:all上执行此操作,但你可以使用xs:sequence.

...
    <xs:complexType name="Foo">
        <xs:all>
            <xs:element name="Bars" type="Bars" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="Bars">
        <xs:sequence>
            <xs:element name="Bar" type="barType" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
...
Run Code Online (Sandbox Code Playgroud)

运行xjc后:Foo.java:

    ...
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Foo", propOrder = {

    })
    public class Foo {

        @XmlElement(name = "Bars", required = true)
        protected Bars bars;

        public Bars getBars() {
            return bars;
        }

        public void setBars(Bars value) {
            this.bars = value;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Bars.java:

    ...
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Bars", propOrder = {
        "bar"
    })
    public class Bars {

        @XmlElement(name = "Bar", required = true)
        protected List<String> bar;

        ...
    }
Run Code Online (Sandbox Code Playgroud)

使用xs:seqence获取Bars列表(maxOccurs ="unbounded"):XSD:

    ...
    <xs:complexType name="Foo">
        <xs:sequence>
            <xs:element name="Bars" type="Bars" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Bars">
        <xs:sequence>
            <xs:element name="Bar" type="barType" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    ...
Run Code Online (Sandbox Code Playgroud)

Foo.java:

...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = {
    "bars"
})
public class Foo {

    @XmlElement(name = "Bars", required = true)
    protected List<Bars> bars;

    public List<Bars> getBars() {
        if (bars == null) {
            bars = new ArrayList<Bars>();
        }
        return this.bars;
    }
}
Run Code Online (Sandbox Code Playgroud)


mgl*_*che 2

另一种方法是删除周围的 <bars> 元素,XML 看起来不再那么漂亮,但它会使 java 代码更易于阅读。与 xjc 的简单绑定(请参阅http://jaxb.java.net/nonav/jaxb20-fcs/docs/vendorCustomizations.html)一起,它将生成非常漂亮且有用的 java 代码。