2013-05-20 86 views
1

以下是我需要針對xsd文件進行驗證的xml文件。xml針對cs中的xsd#

XML文件1

<ROOT ElementType="1" > 
    <ELEMENT_ONE> 
     . 
     . 
     . 
    </ELEMENT_ONE> 
    <ELEMENT_ONE> 
     . 
     . 
     . 
    </ELEMENT_ONE> 
</ROOT> 

XML文件2

<ROOT ElementType="2" > 
    <ELEMENT_TWO> 
     . 
     . 
     . 
    </ELEMENT_TWO> 
    <ELEMENT_TWO> 
     . 
     . 
     . 
    </ELEMENT_TWO> 
</ROOT> 

XML文件3

<ROOT ElementType="3" > 
    <ELEMENT_THREE> 
     . 
     . 
     . 
    </ELEMENT_THREE> 
</ROOT> 

XML文件4

<ROOT ElementType="4" > 
    <ELEMENT_FOUR> 
     . 
     . 
     . 
    </ELEMENT_FOUR> 
</ROOT> 

XML文件5

<ROOT ElementType="5" > 
    <ELEMENT_FIVE> 
     . 
     . 
     . 
    </ELEMENT_FIVE> 
</ROOT> 

XML文件6

<ROOT ElementType="6" > 
    <ELEMENT_ONE> 
     . 
     . 
     . 
    </ELEMENT_ONE> 
    <ELEMENT_TWO> 
     . 
     . 
     . 
    </ELEMENT_TWO> 
    <ELEMENT_FIVE> 
     . 
     . 
     . 
    </ELEMENT_FIVE> 
    <ELEMENT_ONE> 
     . 
     . 
     . 
    </ELEMENT_ONE> 
    <ELEMENT_TWO> 
     . 
     . 
     . 
    </ELEMENT_TWO> 
</ROOT> 

下面是針對其上面的XML文件需要XSD文件驗證。

<xsd:element name = "ROOT"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:choice> 
       <xsd:element ref = "agent:ELEMENT_ONE" minOccurs = "1" maxOccurs = "unbounded"/> 
       <xsd:element ref = "agent:ELEMENT_TWO" minOccurs = "1" maxOccurs = "unbounded"/> 
       <xsd:element ref = "agent:ELEMENT_THREE" minOccurs = "1" maxOccurs = "1"/> 
       <xsd:element ref = "agent:ELEMENT_FOUR" minOccurs = "1" maxOccurs = "1"/> 
       <xsd:element ref = "agent:ELEMENT_FIVE" minOccurs = "1" maxOccurs = "1"/> 
      </xsd:choice> 
     </xsd:sequence> 

     <xsd:attribute name = "ElementType" use = "required"> 
      <xsd:simpleType> 
       <xsd:restriction base="xsd:integer"> 
        <xsd:enumeration value="1"/> 
        <xsd:enumeration value="2"/> 
        <xsd:enumeration value="3"/> 
        <xsd:enumeration value="4"/> 
        <xsd:enumeration value="5"/> 
        <xsd:enumeration value="6"/> 
       </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:attribute> 

以上XSD驗證工作正常情況下,1〜5 XML文件6可以有任意數量ELEMENT_ONE或ELEMENT_TWO或只是一個ELEMENT_FIVE。我如何在xsd驗證中包含情況6?

如果我不能在這個xsd文件中包含情況6,那麼是否有更好的方案來處理上述情況?

謝謝大家提前回復。

回答

0

在XSD 1.0中,無法根據定義的屬性ElementType的值限制<ROOT>的架構。這個問題類似於試圖將單詞本身定義爲定義的一部分。

你能做的最好的是:

<xsd:element name = "ROOT"> 
    <xsd:complexType> 
     <xsd:choice> 
      <xsd:sequence> 
       <xsd:choice> 
        <xsd:element ref="agent:ELEMENT_ONE" minOccurs="1" maxOccurs="unbounded"/> 
        <xsd:element ref="agent:ELEMENT_TWO" minOccurs="1" maxOccurs="unbounded"/> 
        <xsd:element ref="agent:ELEMENT_THREE" minOccurs="1" maxOccurs="1"/> 
        <xsd:element ref="agent:ELEMENT_FOUR" minOccurs="1" maxOccurs="1"/> 
        <xsd:element ref="agent:ELEMENT_FIVE" minOccurs="1" maxOccurs="1"/> 
       </xsd:choice> 
      </xsd:sequence> 
      <xsd:sequence> 
       <xsd:element ref="agent:ELEMENT_ONE" minOccurs="0" maxOccurs="unbounded" /> 
       <xsd:element ref="agent:ELEMENT_TWO" minOccurs="0" maxOccurs="unbounded" /> 
       <xsd:element ref="agent:ELEMENT_FIVE" minOccurs="1" maxOccurs="1" /> 
      </xsd:sequence> 
     </xsd:choice> 

     <xsd:attribute name = "ElementType" use = "required"> 
      <xsd:simpleType> 
       <xsd:restriction base="xsd:integer"> 
        <xsd:enumeration value="1"/> 
        <xsd:enumeration value="2"/> 
        <xsd:enumeration value="3"/> 
        <xsd:enumeration value="4"/> 
        <xsd:enumeration value="5"/> 
        <xsd:enumeration value="6"/> 
       </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:attribute> 
    </xsd:complexType> 
</xsd:element> 

然後,你就必須分別驗證了「正確的模式」是根據系統提供的ElementType屬性的值使用。

請注意,您想在XSD 1.1中執行操作。

+0

我已經嘗試了上述XSD文件,我得到以下錯誤:元素的 –

+0

多個定義的「http://什麼」:Element_ONE」導致內容模型變得曖昧。內容模型必須被形成爲使得在元素信息項序列的驗證期間,直接地,間接或隱含地包含在其中以試圖驗證序列中的每個項目的粒子可以被唯一地確定而不檢查內容或屬性該項目,並且沒有關於序列剩餘部分中的項目的任何信息。 –

+0

嗯,好的。但正如我之前所說,這不是XSD 1.0支持的情況。我聽說XSD 1.1可能會讓你做這樣的事情。如果我想到其他東西(或者可以做出類似上述工作的東西),我一定會回到這裏爲你編輯我的答案。 – fourpastmidnight