2012-05-30 115 views
1

對於像這樣的XML文檔,使用XSD架構文件驗證XML文件。 (XML結構)

<Products> 
    <productTypes> 
     <productType name="BigOranges"> 
      <product> 
       <name>BigOrange1</name> 
       <quatity>25</quatity> 
      </product> 
      <product> 
       <name>BigOrange2</name> 
       <quatity>55</quatity> 
      </product> 
     </productType> 
     <productType name="BigApples"> 
      <product> 
       <name>BigApples1</name> 
       <quatity>25</quatity> 
      </product> 
      <product> 
       <name>BigApples2</name> 
       <quatity>55</quatity> 
      </product> 
     </productType> 
    </productTypes> 
</Products> 

我試圖自動生成XSD文件中看到一個例子,這是生成的。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:simpleType name="T_quatity"> 
     <xs:restriction base="xs:byte"> 
      <xs:enumeration value="25"/> 
      <xs:enumeration value="55"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="T_name"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="BigApples1"/> 
      <xs:enumeration value="BigApples2"/> 
      <xs:enumeration value="BigOrange1"/> 
      <xs:enumeration value="BigOrange2"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="AT_1"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="BigApples"/> 
      <xs:enumeration value="BigOranges"/> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:complexType name="T_productTypes"> 
     <xs:sequence> 
      <xs:element ref="productType" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="T_productType"> 
     <xs:sequence> 
      <xs:element ref="product" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute ref="name" use="required"/> 
    </xs:complexType> 
    <xs:complexType name="T_product"> 
     <xs:sequence> 
      <xs:element ref="name"/> 
      <xs:element ref="quatity"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="T_Products"> 
     <xs:sequence> 
      <xs:element ref="productTypes"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:attribute name="name" type="AT_1"/> 
    <xs:element name="quatity" type="T_quatity"/> 
    <xs:element name="productTypes" type="T_productTypes"/> 
    <xs:element name="productType" type="T_productType"/> 
    <xs:element name="product" type="T_product"/> 
    <xs:element name="name" type="T_name"/> 
    <xs:element name="Products" type="T_Products"/> 
</xs:schema> 

看看上面,我可以看到發生了什麼是他們類型被定義,然後在元素被定義後使用。我不明白的是,元素是一個接一個地定義的,不遵循XML消息的結構。

如果此架構將被用於驗證XML文檔,如何將XML文件的結構驗證?例如,使用上述模式,它如何知道productTypes元素是productType標記的內部標記?

回答

2

你有你的問題有點不對的說明...它應該已經它是如何知道productTypes元素是 productType 產品標籤

我內標籤認爲讓你感到困惑的是全局元素在XSD文件中的顯示順序,它與生成的XSD的創作風格有關,這種風格通常被稱爲「伊甸園」。

應當指出的是,有一個標準的XML實例這些全局定義的XSD顯示方式之間沒有任何關係,和。例如,如果您熟悉UML類圖,則與可視化UML類圖內類的位置與真實世界中該類的實際用法的相同方式無關。

作爲一個工具,我現在可以看到,從你的困惑,在伊甸園學習XSD)可以證明一個壞的起點,如果一個人試圖遵循XML結構。

下面是另一個生成的XSD,它適用於相同的XML;我想你可能會覺得這更直觀(順便說一句,這種創作風格由於其深層嵌套結構而被稱爲「俄羅斯娃娃」)。

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Products"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="productTypes"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="productType"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element maxOccurs="unbounded" name="product"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="name" type="xsd:string" /> 
          <xsd:element name="quatity" type="xsd:unsignedByte" /> 
         </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element> 
        </xsd:sequence> 
        <xsd:attribute name="name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

我認爲,上述也強調和澄清@Romil的你的情況回答(他指的是T_Products)。

至於驗證是如何工作的,這並不容易解釋。你可以把它看作一個狀態機器,狀態之間的轉換由你在XSD中的約束(最小/最大值發生,序列與選擇或所有)控制。 XML閱讀器通過XML,並嘗試從狀態轉移到狀態;當它到達從那裏是沒有出路的一個點,它可能是一個錯誤,或者驗證成功,取決於...

+0

是上面的格式,使我更有意義比「伊甸園」的做法。哪一種是最常用的方法,是否比其他方法有什麼不利之處? – ziggy

+0

在帖子中解釋太多了......嘗試[此鏈接](http://developers.sun.com/jsenterprise/archive/nb_enterprise_pack/reference/techart/design_patterns.html)。在現實生活中,俄羅斯娃娃是相當侷限於學習(至少我沒有看到它在任何生產環境中)。爲了增添混亂,還有兩種風格,威尼斯百葉窗和薩拉米切片;實際上,伊甸園是威尼斯人和薩拉米人的組合。如果有的話,我主要看過威尼斯人和花園。有關比較分析,請參閱外部鏈接。 –

+0

好的,謝謝你會嘗試和調查更多。 – ziggy

1

的xs:複雜類型用於顯示其中對象將被嵌套在此父對象。 xs:sequence顯示父對象中子對象的順序。

xs:simpleType表示是原子對象。