2011-06-14 86 views
1

我想寫一個xsd文件來驗證我的xml。這裏是XML當元素重複時定義xsd文件中元素列表的問題

<Record xmlns="http://example.com/FixedBinaryFile.xsd" Name="Clients"> 
    <Padding Size="5"> 
    <RecordEntry Name="Foo1" DataType ="Char"/> 
    <RecordEntry Name="Foo2" DataType="AnsiString" MaxSize="8"/> 
    <RecordEntry Name="Foo3" DataType="AnsiString" MaxSize="25"/> 
    <Padding Size="2"/> 
    <RecordEntry Name="Foo4" DataType="Byte"/> 
    <Padding Size="1"/> 
    <RecordEntry Name="Foo5" DataType="UInt16"/> 
    <RecordEntry Name="Foo6" DataType="AnsiString" MaxSize="3"/> 
    <RecordEntry Name="Foo7" DataType="AnsiString" MaxSize ="3"/> 
    <Padding Size="22"/> 
</Record> 

這裏的樣品被定義XSD它

<xs:element name="Record"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="RecordEntry" type="RecordEntry" minOccurs="1" maxOccurs="unbounded"/> 
     <xs:element name="Padding" type ="PaddingEntry" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute name="Name" type="xs:string" use ="required"/> 
    </xs:complexType> 
    </xs:element> 

我的問題是sequence不允許我把那裏曾經我想填充項(現在我可以儘可能多的RecordEntry條目,因爲我想跟着儘可能多的Padding條目,因爲我想要的)。

我的初步想法是使用all代替序列。但它不會讓我使用allmaxOccurs

我需要做什麼來正確定義我的列表?

編輯: Freek說得對,這是我不得不改變它的工作。

<xs:element name="Record"> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
     <xs:element name="Padding" type ="PaddingEntry" minOccurs="0" maxOccurs="unbounded"/> 
     <xs:element name="RecordEntry" type="RecordEntry" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute name="Name" type="xs:string" use ="required"/> 
    </xs:complexType> 
    </xs:element> 

回答

2

您還可以設置的minOccurs和maxOccurs的XS:順序設置,以適當的值(可能的minOccurs = 「0」 的maxOccurs = 「無界」)應該解決您的問題。

+0

問題是填充後有更多的RecordEntries。如果在填充後添加RecordEntry,則驗證失敗。 – 2011-06-14 17:23:17

+0

您的解決方案已經在我的代碼中,請參閱第二個代碼框。它不能解決問題。 – 2011-06-14 17:25:03

+0

嘗試用替換,這可以讓您的序列無限重複,從而有效地解決您的問題。 – Freek 2011-06-14 17:25:52