2016-03-02 48 views
2

我需要創建一個XSD 1.0,驗證XML文件。隨機順序和maxOccurs中的元素> 1

驗證將使用lxml.etree,並且該工具被支撐只是XML模式1.0(lxml with schema 1.1

,我需要使用的結構是類型:

item 
    | owners* 
    | config+ 
    | | config_id 
    | | tests* 
    | | picked? 
    | | capability* 
    | | | name 
    | | | value 

二手符號是:

  • *的的Elemen t可以出現零次或多次。
  • +元素可以發生一次或多次。
  • ?該元素是可選的。

配置標籤中的元素可以以任意順序,這意味着我不能使用<sequence>指示器。 <all>指標給我的隨機順序,但在這種情況下,maxOccurs是1. <choice>指標與maxOccurs="unbounded"將給我的隨機順序和元素的多個數量,但不會有元素的底限制。

我的XSD文件看起來像:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

<!--Schema version: 1.0, date: 29-02-2016--> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <!-- definition of complex types -->  
    <xs:complexType name="capability_type"> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="value" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="config_type"> 
    <xs:all> 
     <xs:element name="config_id" type="xs:string" /> 
     <xs:element name="tests" type="xs:string" minOccurs="0" 
          maxOccurs="unbounded" /> 
     <xs:element name="picked" type="xs:string" minOccurs="0" /> 
     <xs:element name="capability" type="capability_type" 
          minOccurs="0" maxOccurs="unbounded" /> 
    </xs:all> 
    </xs:complexType> 

    <xs:complexType name="item_type"> 
    <xs:sequence> 
     <xs:element name="owners" type="xs:string" minOccurs="0" 
          maxOccurs="unbounded" /> 
     <xs:element name="config" type="config_type" minOccurs="1" 
          maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 

    <!-- definition of schema --> 
    <xs:element name="item" type="item_type" /> 

</xs:schema> 

使用這個模式我收到錯誤:

element element: Schemas parser error : Element '{ http://www.w3.org/2001/XMLSchema }element': Invalid value for maxOccurs (must be 0 or 1).

是否有我的問題,任何的替代品?

回答

1

是的,有替代品:

  1. 徹底摒棄隨機順序要求。它往往比它的價值更麻煩。
  2. 通過遷移config_idpickedxs:all和遷移從xs:all孩子maxOccurs="unbounded"xs:all本身部分放棄隨機順序要求。
  3. 保留隨機順序要求,將maxOccurs="unbounded"遷移到xs:all,並使用XSD 1.1斷言強制執行其他出現約束。
+0

你知道任何XSD 1.1驗證器在Linux中也是免費的嗎? –

+0

請參見[Linux命令行工具驗證XSD 1.1?](http://stackoverflow.com/questions/18782706/linux-command-line-tool-validating-xsd-1-1) – kjhughes