gpt4 book ai didi

c# - 在 XSD 中表示一对重复的 XML 元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:41:01 25 4
gpt4 key购买 nike

我目前遇到 XSD 问题。通常一个条目看起来像这样:

<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>

最佳答案

您只是错过了 /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);
}
}
}
}

关于c# - 在 XSD 中表示一对重复的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com