2013-10-24 3 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# 클래스로 변환 할 때 Stops 배열로 인쇄됩니다.

<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 인수를 놓쳤다. 이 같은

시도 뭔가 :

[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; 
    } 
} 

간단한 테스트 프로그램과 같은 : XSD/C/순서는 출력은 추가 주문 값 덕분에 무슨 구별 될

을 your.xsd 이렇게하면 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); 
      } 
     } 
    } 
} 
관련 문제