C# 在XSD中表示一对重复的XML元素
我目前在使用XSD时遇到问题。通常,条目如下所示:C# 在XSD中表示一对重复的XML元素,c#,xml,xsd,xml-serialization,xsd.exe,C#,Xml,Xsd,Xml Serialization,Xsd.exe,我目前在使用XSD时遇到问题。通常,条目如下所示: <Entry Num="4"> <Info> <Name>Something</Name> <ID>1234</ID> <Start>2013-01-07</Start> <Stop>2013-01-09</Stop> <Comple
<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>
某物
1234
2013-01-07
2013-01-09
6.
但有时会像这样:
<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>
某物
5678
2013-01-08
2013-01-10
2013-01-11
2013-01-12
14
为了尝试捕捉多次启动和停止的可能性,我尝试了以下方法:
<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>
某物
5678
2013-01-08
2013-01-11
2013-01-10
2013-01-12
14
这与XML文件不匹配。有人知道如何正确地做这样的事情吗?非常感谢
我提出了一个可行的解决方案,但并不理想
当前解决方案:
<xs:choice minOccurs="2" maxOccurs="unbounded">
<xs:element name="Start" type="xs:dateTime"/>
<xs:element name="Stop" type="xs:dateTime"/>
</xs:choice>
您只是错过了
/order
参数
尝试以下操作:xsd/c/order 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);
}
}
}
}