2016-07-11 4 views
0

MSDNの例に基づいてXSDスキーマを作成しようとしています。 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ファイルの

<?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行目は、検証に失敗します。

<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による複合型がxsd:elementxsd:complexTypeのための有効な子要素ではないことを意味している

<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: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:sequence要素は、要素の周りに欠けています。

<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:complexType><xsd:element>を追加することはできません。

あなたが最初<shipTo>タグを持つようにしたいと仮定すると、<item>タグは、あなたはorderタイプのコンテンツを構成するタグを収集<xsd:sequence>を使用します。

<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

関連する問題