xsd- SAXParseException无效

时间:2015-05-22 08:58:16

标签: xml xsd

我目前正在使用xsd并尝试为包含某些订单商品的订单定义一个简单的XSD文件。但是,如果我验证xsd文件,我得到一个SAXParseException。谁能看到问题?到目前为止我无法修复它:(

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="order">
    <xs:complexType>
        <xs:attribute name='orderId' type='xs:string' use='required'/>
        <xs:attribute name='orderDate' type='xs:date' use='required'/>
        <xs:sequence>
            <xs:element name='orderItem' type='OrderItem'/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name='OrderItem'>
   <xs:sequence>
        <xs:element name='title' type='xs:string'/>
        <xs:element name='manufacturer' type='Company'/>
        <xs:element name='quantity' type='xs:positiveInteger'/>
        <xs:element name='price' type='xs:decimal'/>
   </xs:sequence>
</xs:complexType>

<xs:complexType name='Company'>
    <xs:element name='name' type='xs:string'/>
    <xs:element name='adress' type='Adress'/>
</xs:complexType>

<xs:complexType name="Adress">
    <xs:element name="street" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="zip" type="xs:string"/>
    <xs:element name="country" type="xs:string"/>
</xs:complexType>

</xs:schema>

并且有一个示例xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<order orderId='1001' orderDate='2015-05-22'>
    <orderItem>
        <title>Nikon D5200</title>
        <manufacturer>
            <name>Nikon</name>
            <adress>
                <street>Hauptstr. 12</street>
                <city>Mannheim</city>
                <zip>68161</zip>
                <country>DE</country>
            </adress>
        </manufacturer>
        <quantity>1</quantity>
        <price>559.25</price>
    </orderItem>
</order>

例外:

  

线程“main”org.xml.sax.SAXParseException中的异常; systemId:file:/ C:/Users/andre/Documents/dtd/order.xsd; lineNumber:8; columnNumber:16; s4s-elt-invalid-content.1:“#AnonType_order”中的内容无效。元素“序列”无效,经常发生或在错误的地方发生。

编辑:对我而言,另一个谜团是,我什么时候需要?我在标签中使用它,所以我可以插入几个标签,这是有道理的。但它是否需要在标签定义中?因为一个orderItem对象应该只有一个标题,所以我需要一个标签吗?

1 个答案:

答案 0 :(得分:1)

引发错误的原因是您的架构未正确构建。

对于元素订单

xs:sequence必须在xs:attribute声明之前出现。正确的版本是:

<xs:element name="order">
    <xs:complexType>
        <xs:sequence>
            <xs:element name='orderItem' type='OrderItem'/>
        </xs:sequence>
        <xs:attribute name='orderId' type='xs:string' use='required'/>
        <xs:attribute name='orderDate' type='xs:date' use='required'/>
    </xs:complexType>
</xs:element>

对于complexTypes 公司地址

您必须使用xs:sequence指定您希望元素按特定顺序显示。应该这样纠正

<xs:complexType name='Company'>
    <xs:sequence>
      <xs:element name='name' type='xs:string'/>
      <xs:element name='adress' type='Adress'/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Adress">
    <xs:sequence>
      <xs:element name="street" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="zip" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

这些是非常基本的功能。强烈建议您阅读有关XML Schema的任何教程,以便熟悉它。