2016-12-30 13 views
0

我有一個場景,其中我有兩個不同位置具有相同類型的相同元素名稱的xml架構。有些xml會將元素放在第一個位置,而其他幾個xml會將元素放在第二個位置。如何在架構中的兩個不同位置定義兩個相同名稱的相同類型的元素

<xs:element minOccurs="0" maxOccurs="1" name="DisplayUnit" type="DisplayUnit" /> 
    <xs:element minOccurs="0" maxOccurs="1" name="Serial" type="Serial" /> 
    <xs:element minOccurs="0" maxOccurs="1" name="DisplayUnit" type="DisplayUnit"/> 

在我的xml中,有些時候DisplayUnit會出現在串口和之後的某個時間。我如何處理這種情況?

我還有一個解釋。在這種情況下,元素不是類型而是屬性。位置可以位於輸出元素的上方或下方,但只會像第一個場景一樣出現一次。

<xs:element minOccurs="0" maxOccurs="0" name="MaxA" nillable="true" type="xs:unsignedInt" /> 
    <xs:element minOccurs="0" maxOccurs="0" name="Output" type="Output" /> 
    <xs:element minOccurs="0" maxOccurs="1" name="MaxA" nillable="true" type="xs:unsignedInt" /> 

我搜索了很多,但我沒有得到任何解決方案。 在這方面的任何即時幫助表示讚賞。

回答

0

你的問題有兩部分:XSD部分和解析器部分。

XSD

您的XSD並不適合你想要達到的效果。正如所寫的那樣,DisplayUnit元素可能在文檔中出現兩次。有兩種方法可以解決這個問題,具體取決於您的場景。

如果DisplayUnitSerial元素的序列或整個序列可以在任何順序中唯一的元素,你可以使用<xs:all>而不是<xs:sequence><xs:all>允許元素以任何順序:

<xs:all> 
    <xs:element minOccurs="0" maxOccurs="1" name="DisplayUnit" type="DisplayUnit" /> 
    <xs:element minOccurs="0" maxOccurs="1" name="Serial" type="Serial" /> 
</xs:all> 

如果這不是一個選擇,因爲其他因素預計將在序列,可以更換<xs:choice>,該序列的一部分:

<xs:choice> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" name="DisplayUnit" type="DisplayUnit" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="Serial" type="Serial" /> 
    </xs:sequence> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" name="Serial" type="Serial" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="DisplayUnit" type="DisplayUnit" /> 
    </xs:sequence> 
</xs:choice> 

解析在C#

一旦你有固定的XSD和您確認您的文檔,你知道,即DisplayUnitSerial標籤中只有零個或一個出現。然後您可以將XML簡單地加載到一個XDocumentXmlDocument(如果你不這樣做的話),只是他們的名字訪問元素(順序如何):

//Assuming there is an XElement named parentElement 
XElement displayUnitElement = parentElement.Element("DisplayUnit"); 
if (displayUnitElement != null) { 
    //... 
} 
XElement serialElement = parentElement.Element("Serial"); 
if (serialElement != null) { 
    //... 
} 

在更復雜的XML,你也可以使用XPath。一旦您的文檔針對XSD進行驗證,您就可以確定其結構。

相關問題