2016-07-11 3 views
0

Я пытаюсь написать схему XSD на основе примера от MSDN. Я изменил пример так, чтобы XSD был локальным для xml-файла и не использовал пространство имен. Однако XML не проверяется.Как исправить ошибки проверки схемы xsd?

XSD-файл (sys_params.xsd):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tempuri.org/po.xsd" 
xmlns="http://tempuri.org/po.xsd" elementFormDefault="qualified"> 
<xs:annotation> 
    <xs:documentation xml:lang="en"> 
    Purchase order schema for Example.com. 
    Copyright 2000 Example.com. All rights reserved. 
    </xs:documentation> 
</xs:annotation> 

<xs:element name="purchaseOrder" type="PurchaseOrderType"/> 

<xs:element name="comment" type="xs:string"/> 

<xs:complexType name="PurchaseOrderType"> 
    <xs:sequence> 
    <xs:element name="shipTo" type="USAddress"/> 
    <xs:element name="billTo" type="USAddress"/> 
    <xs:element ref="comment" minOccurs="0"/> 
    <xs:element name="items" type="Items"/> 
    </xs:sequence> 
    <xs:attribute name="orderDate" type="xs:date"/> 
</xs:complexType> 

<xs:complexType name="USAddress"> 
     <xs:annotation> 
     <xs:documentation> 
     Purchase order schema for Example.Microsoft.com. 
     Copyright 2001 Example.Microsoft.com. All rights reserved. 
     </xs:documentation> 
     <xs:appinfo> 
     Application info. 
     </xs:appinfo> 
    </xs:annotation> 

    <xs:sequence> 
    <xs:element name="name" type="xs:string"/> 
    <xs:element name="street" type="xs:string"/> 
    <xs:element name="city" type="xs:string"/> 
    <xs:element name="state" type="xs:string"/> 
    <xs:element name="zip" type="xs:decimal"/> 
    </xs:sequence> 
    <xs:attribute name="country" type="xs:NMTOKEN" 
    fixed="US"/> 
</xs:complexType> 

<xs:complexType name="Items"> 
    <xs:sequence> 
    <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="productName" type="xs:string"/> 
     <xs:element name="quantity"> 
     <xs:simpleType> 
     <xs:restriction base="xs:positiveInteger"> 
     <xs:maxExclusive value="100"/> 
     </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element name="USPrice" type="xs:decimal"/> 
     <xs:element ref="comment" minOccurs="0"/> 
     <xs:element name="shipDate" type="xs:date" minOccurs="0"/> 
    </xs:sequence> 
    <xs:attribute name="partNum" type="SKU" use="required"/> 
    </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

<!-- Stock Keeping Unit, a code for identifying products --> 
<xs:simpleType name="SKU"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="\d{3}-[A-Z]{2}"/> 
    </xs:restriction> 
</xs:simpleType> 

</xs:schema> 

XML-файл (sys_params.xml):

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

<purchaseOrder xmlns="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sys_params.xsd" orderDate="1999-10-20"> 
    <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> 

Строка 3 файла XML не проверяет:

<purchaseOrder xmlns="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="leda_sys_params.xsd" orderDate="1999-10-20"> 

погрешность:

Error prefix 'xsi' can not be resolved to namespace URI 

Как я могу исправить это, пожалуйста?

+0

Первый тег должен быть ' potame

ответ

0

http://www.w3schools.com/xml/el_complextype.asp По сложный тип определяется как

<complexType 
id=ID 
name=NCName 
abstract=true|false 
mixed=true|false 
block=(#all|list of (extension|restriction)) 
final=(#all|list of (extension|restriction)) 
any attributes 
> 

(annotation?,(simpleContent|complexContent|((group|all|choice|sequence)?,((attribute|attributeGroup)*,anyAttribute?)))) 

</complexType> 

Это означает, что xsd:element не действует дочерний элемент для xsd:complexType. Вы должны использовать xsd:group, xsd:all, xsd:choice или xsd:sequence вместо этого.

.: например

<xsd:complexType name="order"> 
    <xsd:sequence> 
     <xsd:element name="shipTos" type="shipAddress"/> 
     <xsd:element name="items"  type="cdItems"/> 
    </xsd:sequence> 
</xsd:complexType> 
0

XSD: Элемент последовательности отсутствует вокруг элементов.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="root"/> 
    <xsd:element name="shipOrder" type="order"/> 

    <xsd:complexType name="order"> 
     <xsd:sequence> 
      <xsd:element name="shipTos" type="shipAddress"/> 
      <xsd:element name="items"  type="cdItems"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="shipAddress"> 
     <xsd:sequence> 
      <xsd:element name="name"  type="xsd:string"/> 
      <xsd:element name="street" type="xsd:string"/> 
      <xsd:element name="address" type="xsd:string"/> 
      <xsd:element name="country" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="cdItems"> 
     <xsd:sequence> 
      <xsd:element name="item"  minOccurs="0" maxOccurs="unbounded" type="cdItem"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="cdItem"> 
     <xsd:sequence> 
      <xsd:element name="title"  type="xsd:string"/> 
      <xsd:element name="quantity" type="xsd:positiveInteger"/> 
      <xsd:element name="price"  type="xsd:decimal"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 
+0

Извините, совпадающий с вашим ответом, я попробовал другой пример и обновил свой вопрос. Возможно, это была плохая форма. Пожалуйста, взгляните на мой текущий вопрос? – DavidA

+0

@DavidA вам просто нужно иметь xmlns = "tempuri.org/po.xsd"; и xmlns: xsi = "w3.org/2001/XMLSchema-instance"; в элементе purchaseOrder. –

1

Вы не можете добавлять <xsd:element> непосредственно под <xsd:complexType>.

Предполагая, что вы хотите иметь сначала <shipTo> тег, то <item> тег, вы будете использовать <xsd:sequence> сбор тег составляют содержание order типа:

<xsd:complexType name="order"> 
     <xsd:sequence> 
     <xsd:element name="shipTos" type="shipAddress"/> 
     <xsd:element name="items"  type="cdItems"/> 
     </xsd:sequence> 
    </xsd:complexType> 

Полностью исправленная версия вашей схеме превратится в:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xsd:element name="root"/> 
    <xsd:element name="shipOrder" type="order"/> 
    <xsd:complexType name="order"> 
     <xsd:sequence> 
      <xsd:element name="shipTo" type="shipAddress"/> 
      <xsd:element name="items" type="cdItems"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="shipAddress"> 
     <xsd:sequence> 
      <xsd:element name="name" type="xsd:string"/> 
      <xsd:element name="street" type="xsd:string"/> 
      <xsd:element name="address" type="xsd:string"/> 
      <xsd:element name="country" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="cdItems"> 
     <xsd:sequence> 
      <xsd:element name="item" minOccurs="0" maxOccurs="unbounded" type="cdItem"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:complexType name="cdItem"> 
     <xsd:sequence> 
      <xsd:element name="title" type="xsd:string"/> 
      <xsd:element name="quantity" type="xsd:positiveInteger"/> 
      <xsd:element name="price" type="xsd:decimal"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Примечание: вы не связала <root> элемент к любому типу контента ...

+0

Прошу прощения, совпадающий с вашим ответом. Я попробовал другой пример и обновил свой вопрос. Возможно, это была плохая форма. Пожалуйста, взгляните на мой текущий вопрос? – DavidA

+1

@DavidA Слишком плохо. В этом случае лучше удалить свой вопрос и спросить новый :) – potame

+0

Я сделаю это. Извините за то, что тратил время людей. – DavidA

Смежные вопросы