如何在XML中指定complexType列表?

时间:2018-03-15 12:12:33

标签: java xml xsd jaxb jaxb2

我有XML指定以下内容:

    <xs:element name="getNewsResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="newsItem" type="tns:newsList"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="newsList">
        <xs:list itemType="tns:news"/>
    </xs:simpleType>

   <xs:complexType name="news">
        <xs:sequence>
            <xs:element name="id" type="xs:string"/>
            <xs:element name="date" type="xs:string"/>
            <xs:element name="author" type="tns:author"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="shortDescription" type="xs:string"/>
            <xs:element name="content" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

我想在回复中提供新闻列表。但是,当我想用​​jaxb2创建Java对象时,当我运行mvn clean compile -X时,xml会返回以下错误:

org.xml.sax.SAXParseException: cos-st-restricts.1.1: The type 'newsList' is atomic, so its {base type definition}, 'tns:news', must be an atomic simple type definition or a built-in primitive datatype.

我应该如何更改XML才能编译?

2 个答案:

答案 0 :(得分:2)

除了使用内置列表类型之外,您还可以通过从现有原子类型派生来创建新的列表类型。 您无法从现有列表类型创建列表类型,也无法从复杂类型创建列表类型。

https://www.w3.org/TR/xmlschema-0/#ListDt

这是我工作的XSD之一,具有多个地址的用户:

<xs:complexType name="user">
    <xs:sequence>
        <xs:element name="addresses" type="tns:addressData" nillable="true" minOccurs="0" maxOccurs="unbounded"/>

请注意, addressData 是complexType。

我想这就是你需要的:

<xs:element name="getNewsResponse">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="newsItems" type="tns:news" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name="news">
    <xs:sequence>
        <xs:element name="id" type="xs:string"/>
        <xs:element name="date" type="xs:string"/>
        <xs:element name="author" type="tns:author"/>
        <xs:element name="title" type="xs:string"/>
        <xs:element name="shortDescription" type="xs:string"/>
        <xs:element name="content" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

答案 1 :(得分:0)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"     
           targetNamespace="http://pro.com/balcao/xdto"
            xmlns:tns="http://pro.com/balcao/xdto"
           elementFormDefault="qualified">
    

    <xs:element name="salvarCliente" >
        <xs:complexType>
        <xs:sequence>
            <xs:element name="nome" type="xs:string" />
            <xs:element name="telefone" type="xs:string" />
            <xs:element name="provincia" type="xs:string" />
            <xs:element name="municipio" type="xs:string" />
        </xs:sequence>
        </xs:complexType> 
    </xs:element>



        <xs:complexType name="listarClientes">
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element name="clientes" type="tns:cliente" />
            </xs:sequence>
        </xs:complexType>
 
 
    <xs:complexType name="cliente">
            <xs:sequence>
                <xs:element name="nome" type="xs:string" />
                <xs:element name="telefone" type="xs:string" />
                <xs:element name="provincia" type="xs:string" />
                <xs:element name="municipio" type="xs:string" />
            </xs:sequence>
    </xs:complexType> 
</xs:schema>