2013-10-24 23 views
3

我目前遇到了XSD問題。通常一個條目看起來是這樣的:在XSD中表示重複的一對XML元素

<Entry Num="4"> 
    <Info> 
     <Name>Something</Name> 
     <ID>1234</ID> 
     <Start>2013-01-07</Start> 
     <Stop>2013-01-09</Stop> 
     <Completed>6</Completed> 
    </Info> 
</Entry> 

但有時它看起來就像這樣:

<Entry Num="5"> 
    <Info> 
     <Name>SomethingElse</Name> 
     <ID>5678</ID> 
     <Start>2013-01-08</Start> 
     <Stop>2013-01-10</Stop> 
     <Start>2013-01-11</Start> 
     <Stop>2013-01-12</Stop> 
     <Completed>14</Completed> 
    </Info> 
</Entry> 

要嘗試捕獲多個啓動和停止我嘗試了以下東西的潛力:

<xs:sequence maxOccurs="unbounded"> 
    <xs:element name="Start" type="xs:dateTime" maxOccurs="1"/> 
    <xs:element name="Stop" type="xs:dateTime" maxOccurs="1"/> 
</xs:sequence> 

<xs:sequence maxOccurs="unbounded"> 
    <xs:element name="Start" type="xs:dateTime" /> 
    <xs:element name="Stop" type="xs:dateTime" /> 
</xs:sequence> 

<xs:sequence maxOccurs="unbounded"> 
    <xs:sequence> 
     <xs:element name="Start" type="xs:dateTime" /> 
     <xs:element name="Stop" type="xs:dateTime" /> 
    </xs:sequence> 
</xs:sequence> 

<xs:sequence maxOccurs="unbounded"> 
    <xs:sequence> 
     <xs:element name="Start" type="xs:dateTime" maxOccurs="1"/> 
     <xs:element name="Stop" type="xs:dateTime" maxOccurs="1"/> 
    </xs:sequence> 
</xs:sequence> 

但他們都產生了一個開始的數組,然後使用xsd.exe將其轉換爲C#類,然後序列化爲:

<Entry Num="5"> 
    <Info> 
     <Name>SomethingElse</Name> 
     <ID>5678</ID> 
     <Start>2013-01-08</Start> 
     <Start>2013-01-11</Start> 
     <Stop>2013-01-10</Stop> 
     <Stop>2013-01-12</Stop> 
     <Completed>14</Completed> 
    </Info> 
</Entry> 

這與XML文件不匹配。有誰知道如何正確地做這樣的事情?非常感謝。

我想出了一個可行的解決方案,但並不理想。

目前的解決方案:

<xs:choice minOccurs="2" maxOccurs="unbounded"> 
    <xs:element name="Start" type="xs:dateTime"/> 
    <xs:element name="Stop" type="xs:dateTime"/> 
</xs:choice> 

回答

1

您只需錯過了/order說法。

嘗試這樣:XSD/C /訂單your.xsd

輸出會從你憑藉着額外的訂單價值是什麼區分:

[System.Xml.Serialization.XmlElementAttribute("Start", typeof(System.DateTime), DataType="date", Order=2)] 
[System.Xml.Serialization.XmlElementAttribute("Stop", typeof(System.DateTime), DataType="date", Order=2)] 
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")] 
public System.DateTime[] Items { 
    get { 
     return this.itemsField; 
    } 
    set { 
     this.itemsField = value; 
    } 
} 

一個簡單的測試程序,如這將正確地往返您的XML:

using System; 
using System.IO; 
using System.Xml.Serialization; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(Entry)); 
      Entry o; 
      using (Stream s = File.OpenRead(@"D:\...\representing-a-repeated-pair-of-xml-elements-in-xsd-2.xml")) 
      { 
       o = (Entry)ser.Deserialize(s); 
      } 
      using (Stream s = File.OpenWrite(@"D:\...\representing-a-repeated-pair-of-xml-elements-in-xsd-3.xml")) 
      { 
       ser.Serialize(s, o); 
      } 
     } 
    } 
}