2014-01-16 34 views
0

我想動態這個詞有誤導性。我感興趣的元素可能有三種可能的子結構。一個例子可以是:動態子結構的xml元素的XSD設計

<body> 
    <date></date> 
    <addr></addr> 
</body> 

<body> 
    <loc></loc> 
    <time> </time> 
    <city> </city> 
</body> 

<body> 
    //a whole lot of different sub elements 
</body> 

我停留在設計,可以被用來驗證上述三種結構中的XSD(三種結構是已知和固定)。我不確定我是否正確地提出了這個問題。請闡明解決方案,甚至是可行性。

回答

2

像這樣的工作,我想:

<xs:group name="group_one"> 
    <xs:sequence> 
    <xs:element name="date"/> 
    <xs:element name="addr"/> 
    </xs:sequence> 
</xs:group> 

<xs:group name="group_two"> 
    <xs:sequence> 
    <xs:element name="loc"/> 
    <xs:element name="time"/> 
    <xs:element name="city"/> 
    </xs:sequence> 
</xs:group> 

<xs:complexType name="body"> 
    <xs:choice> 
    <xs:group ref="group_one" /> 
    <xs:group ref="group_two"/> 
    </xs:choice> 
</xs:complexType> 

你當然也可以添加更多的組,並有更多的選擇。

+0

爲了完整性......有一個潛在的警告,因爲第三組沒有明確的界定......由於XSD的唯一粒子屬性的約束。換句話說,如果第三組以「date」或「loc」開始,那麼上述解決方案將需要修改。 –

+0

@PetruGardea非常感謝,這正是我的目標。 – liudaisuda

+0

@Petter正是我需要的。這裏只是另一個問題,沒有在網上找到很多信息。在我的情況下,這些組將需要使用xs:all作爲子元素,因爲它們的順序是任意的,而body元素不是我整個xml文檔中的根元素。在我做了所有的調整之後,vs2012給了我:「所有的組都不是根粒子,或者它被用作延伸」警告。據我所知,這是不允許的是xml規範1.0。但是有沒有解決方法,只要不改變我正在升級的xml文檔? – liudaisuda