2011-05-26 66 views
0

從基於年份的演變XSD/XML開始,我想寫一個更簡單的XSD,只定位不會被修改或刪除的元素,它可以驗證XML來自完整的XSD。XSD名稱 - 具有已知名稱的可選元素的未知可選元素

爲了使簡單:

有了這個XML:

<root> 
    <unknown1/> 
    <known2/> 
    <unknown2/> 
    <known1/> 
    <unknown3/> 
    <unknown4/> 
</root> 

這XSD:

<xsd:schema> 
    <xsd:element name="root"> 
     <xsd:all> 
      <xsd:element name="unknown1" minOccurs="0"/> 
      <xsd:element name="unknown2" minOccurs="0"/> 
      <xsd:element name="unknown3" minOccurs="0"/> 
      <xsd:element name="unknown4" minOccurs="0"/> 
      <xsd:element name="known1" minOccurs="0"/> 
      <xsd:element name="known2" minOccurs="0"/> 
     </xsd:all> 
    </xsd:element name="root"> 
</xsd:schema> 

我想要的東西,如:

<xsd:schema> 
    <xsd:all> 
     <xsd:any processControl="skip" /> 
     <xsd:element name="known1" /> 
     <xsd:element name="known2" /> 
</xsd:schema> 

這XSD無效爲xsd:any只能出現在xsd:sequencexsd:choice

我不知道如何可以驗證原始XML文件具有類似的簡單XSD

回答

0

您可以known1,2的xs:choicexs:any,並設置maxOccursunbounded

編輯:這仍然只處理可選的情況下,但我意識到你不需要嵌入xs:choicexs:sequence

+0

以及如果我沒有知識1和/或知識2的XML?這將驗證,這將是錯誤的 – shubakk 2011-05-26 12:57:12

+0

so known1,known2是必需的,但其餘是可選的?標題說「名稱未知的可選元素與名稱已知的可選元素」,所以我很困惑。 – 2011-05-26 13:54:31

+0

我的歉意,他們是可選的。你會用非可選元素推薦什麼? 即使使用可選元素,如果我知道了1&known2加上額外的元素(例如unknown1),那麼它也不會做正確的事情 – shubakk 2011-05-26 14:02:38

0

這裏是一個工作模式,其允許

  • 自由順序<known1><known2>元件
  • 省略<known1><known2>(或兩者)
  • 任何其它元件的無限量之間之前,之後,或在之間他們

請注意,您必須將<xs:any>所允許的元素限制爲某些其他命名空間不是<known1><known2>。否則架構將變得毫無疑義,因爲<xs:any>也將允許<known1><known2>。另外需要注意的是,我們需要在<xs:choice><xs:sequence>上設置minOccurs屬性,以保持架構的確定性。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
     <xs:choice minOccurs="0"> 
      <xs:sequence> 
      <xs:element name="known1" /> 
      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      <xs:sequence minOccurs="0"> 
       <xs:element name="known2" /> 
       <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      </xs:sequence> 
      </xs:sequence> 
      <xs:sequence> 
      <xs:element name="known2" /> 
      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      <xs:sequence minOccurs="0"> 
       <xs:element name="known1" /> 
       <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      </xs:sequence> 
      </xs:sequence> 
     </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>