我目前正在使用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对象应该只有一个标题,所以我需要一个标签吗?
答案 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>
您必须使用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的任何教程,以便熟悉它。