我正在查看XML Schema primer中的po.xml
示例:
<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20" xmlns="http://www.example.com/PO">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Mill Valley</city>
<state>CA</state>
<zip>90952</zip>
</shipTo>
<billTo country="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Old Town</city>
<state>PA</state>
<zip>95819</zip>
</billTo>
<comment>Hurry, my lawn is going wild!</comment>
<items>
<item partNum="872-AA">
<productName>Lawnmower</productName>
<quantity>1</quantity>
<USPrice>148.95</USPrice>
<comment>Confirm this is electric</comment>
</item>
<item partNum="926-AA">
<productName>Baby Monitor</productName>
<quantity>1</quantity>
<USPrice>39.98</USPrice>
<shipDate>1999-05-21</shipDate>
</item>
</items>
</purchaseOrder>
当我验证它here时,它无法使用以下架构进行验证:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:po="http://www.example.com/PO" targetNamespace="http://www.example.com/PO">
<xsd:annotation>
<xsd:documentation xml:lang="en">
Purchase order schema for Example.com.
Copyright 2000 Example.com. All rights reserved.
</xsd:documentation>
</xsd:annotation>
<xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
<xsd:element name="comment" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="shipTo" type="USAddress"/>
<xsd:element name="billTo" type="USAddress"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN"
fixed="US"/>
</xsd:complexType>
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="productName" type="xsd:string"/>
<xsd:element name="quantity">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="USPrice" type="xsd:decimal"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="partNum" type="SKU" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<!-- Stock Keeping Unit, a code for identifying products -->
<xsd:simpleType name="SKU">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
出现以下错误:
Src-resolve.4.1:错误解决组件&#39; PurchaseOrderType&#39;。检测到“PurchaseOrderType&#39;没有命名空间,但没有目标命名空间的组件不能从架构文档中引用&#39; null&#39;。如果&#39; PurchaseOrderType&#39;意图有一个命名空间,也许需要提供一个前缀。如果它意图“购买订单类型”&#39;没有命名空间,然后一个&#39; import&#39;没有A&#34;命名空间&#34;属性应添加到&#39; null&#39;。
如果我运行xmllint --schema po.xsd po.xml
:
po.xsd:10:元素元素:模式解析器错误:元素&#39; {http://www.w3.org/2001/XMLSchema}元素&#39;,属性&#39;类型&#39;:从此模式到组件的引用不允许使用任何名称空间,因为没有使用import语句指示。
(我在引物中找到的架构中添加了xmlns:po="http://www.example.com/PO" targetNamespace="http://www.example.com/PO"
,希望它能使它工作,但没有运气。)
答案 0 :(得分:2)
要明确的是,您使用的架构和实例文档是XSD Primer中修改的变体。您已通过添加命名空间修改了它们,并且您已经错误地完成了操作。例如,您已将PurchaseOrderType更改为名称空间,但您尚未更改对PurchaseOrderType的引用以反映该更改;它需要像
<xsd:element name="purchaseOrder" type="po:PurchaseOrderType"/>
其中名称空间前缀po绑定到模式的目标名称空间。这同样适用于模式中的其他组件引用。