#xml #xsd
#xml #xsd
Вопрос:
Я смотрю на po.xml
пример в праймере схемы 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>
Когда я проверяю его здесь, он не проходит проверку с использованием следующей схемы:
<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: компонент для устранения ошибок ‘PurchaseOrderType’. Было обнаружено, что ‘PurchaseOrderType’ не имеет пространства имен, но на компоненты без целевого пространства имен нельзя ссылаться из документа схемы ‘null’. Если предполагается, что ‘PurchaseOrderType’ имеет пространство имен, возможно, необходимо указать префикс. Если предполагается, что ‘PurchaseOrderType’ не имеет пространства имен, то к ‘null’ следует добавить ‘import’ без атрибута «namespace».
Подобное происходит, если я запускаю xmllint --schema po.xsd po.xml
:
po.xsd:10: элемент ошибка синтаксического анализатора элементов: Элемент ‘{http://www.w3.org/2001/XMLSchema }элемент’, атрибут ‘тип’: ссылки из этой схемы на компоненты в пространстве имен no не разрешены, поскольку не указаны инструкцией import.
(Я добавил xmlns:po="http://www.example.com/PO" targetNamespace="http://www.example.com/PO"
к корневому элементу в схеме, найденной в primer, в надежде, что это заставит его работать, но безуспешно.)
Ответ №1:
Для ясности, схема и экземпляр документа, которые вы используете, являются модифицированными вариантами тех, которые содержатся в праймере XSD. Вы изменили их, добавив пространство имен, и сделали это неправильно. Например, вы изменили PurchaseOrderType, чтобы он был в пространстве имен, но вы не изменили ссылку на PurchaseOrderType, чтобы отразить это изменение; это должно быть что-то вроде
<xsd:element name="purchaseOrder" type="po:PurchaseOrderType"/>
где префикс пространства имен po привязан к целевому пространству имен схемы. То же самое относится и к другим ссылкам на компоненты в схеме.
Комментарии:
1. О, это все объясняет! 🙂 Я думаю, что я изменился, пытаясь заставить его работать с помощью средства проверки, которое автоматически загружает ссылочный XSD. Но почему изменения пространства имен XSD-файла на
xmlns="http://www.example.com/PO"
недостаточно, чтобы исправить мою ошибку? (Я пробовал, и это тоже не работает.)2. @Mitar Я считаю, что ваши имена элементов не указаны по умолчанию. Вы также должны добавить
elementFormDefault="qualified"
свою схему. Смотрите Пример онлайн-проверки