2016-07-11 7 views
0

Nachdem ich meine vorherige Frage durcheinandergebracht habe, ist hier ein neuer Versuch.Wie xsd Schemavalidierungsfehler zu beheben? (umformuliert)

Ich versuche, ein XSD-Schema basierend auf einem Beispiel von MSDN zu schreiben. Ich habe das Beispiel so geändert, dass das XSD lokal für die XML-Datei ist und keinen Namespace verwendet. Das XML kann jedoch nicht validiert werden.

XSD-Datei (leda_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-Datei (leda_sys_params.xml)

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

<purchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="leda_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> 

Die XML nicht zu überprüfen:

3 145: Error schema document 'leda_sys_params.xsd' has different target namespace from the one specified in instance document '' 
3 145: Error no declaration found for element 'purchaseOrder' 
3 145: Error attribute 'orderDate' is not declared for element 'purchaseOrder' 

Alle Fehler sind auf Linie 3.

Können Sie mir bitte helfen, die Fehler zu beheben?

Antwort

1

Da Sie die Elemente in einem targetNamespace (mit der angefügten URL http://tempuri.org/po.xsd) deklariert haben, benötigen Sie eine XML-Instanz mit einem Element im selben Namespace.

So sollte Ihr XML-Beispiel sein:

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

Alternative Lösung: Wenn Sie don‘die Namensräume überhaupt benötigen, dann XML lassen, wie sie ist, und Ihr Schema wie folgt ändern:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     elementFormDefault="unqualified"> 
+0

Danke. Ich denke, es wäre einfacher, den Ziel-Namespace zu entfernen, so dass keine Abhängigkeit von einer Website besteht. Wie würde ich das bitte machen? – DavidA

+0

@DavidA Ich habe die Antwort so geändert, wie du es verlangst. – potame

+0

Danke, ich bin sehr dankbar für Ihre Hilfe. – DavidA