gpt4 book ai didi

c# - 如何在 C# 中的 XML 序列化期间交替 XML 元素?

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

我有一个数据提供者提供给我们的 XSD 架构。我不能修改它。我使用 XSD.exe 命令行工具生成了这些类。对于它完美运行的一切,我可以在 C# 中创建我的对象,在 XML 中序列化它并根据 XSD 验证它。

我对它的一小部分有疑问。预期的输出是:

    <Physical>
<Class>P</Class>
<Capacity>14</Capacity>
<Class>J</Class>
<Capacity>64</Capacity>
<Class>W</Class>
<Capacity>1</Capacity>
<Class>Y</Class>
<Capacity>2</Capacity>
</Physical>
<Saleable Protected="true">
<Class>P</Class>
<Capacity>14</Capacity>
<Class>J</Class>
<Capacity>64</Capacity>
<Class>W</Class>
<Capacity>1</Capacity>
<Class>Y</Class>
<Capacity>2</Capacity>
</Saleable>

如您所见,Physical 和 Sealable 的子元素交替出现(即 Class,然后是 Capacity,然后是 Class,然后是 Capacity,等等)。

这是由 XSD.exe 生成的类的代码:

public partial class ClassA
{
private string[] classField;

private Integerctype[] capacityField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Class", DataType = "token")]
public string[] Class
{
get
{
return this.classField;
}
set
{
this.classField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Capacity", IsNullable = true)]
public Integerctype[] Capacity
{
get
{
return this.capacityField;
}
set
{
this.capacityField = value;
}
}
}

以及我在序列化后收到的输出:

<Physical>
<Class>P</Class>
<Class>J</Class>
<Class>W</Class>
<Class>Y</Class>
<Capacity>14</Capacity>
<Capacity>64</Capacity>
<Capacity>1</Capacity>
<Capacity>2</Capacity>
</Physical>
<Saleable>
<Class>P</Class>
<Class>J</Class>
<Class>W</Class>
<Class>Y</Class>
<Capacity>14</Capacity>
<Capacity>64</Capacity>
<Capacity>1</Capacity>
<Capacity>2</Capacity>
</Saleable>

如您所见,我们失去了 Class 和 Capacity 之间的交替...

我尝试使用 XmlElementAttribute 的 Order 属性:Class 属性装饰为 Order = 1,Capacity 属性装饰为 Order = 2,但没有帮助。示例:

[System.Xml.Serialization.XmlElementAttribute("Class", DataType = "token", Order = 1)]
public string[] Class

在验证过程中,无论有没有 Order 属性,我都会收到如下错误:

The element 'Physical' in namespace 'xxx' has invalid child element 'Class' in namespace 'xxx'. List of possible elements expected: 'Capacity' in namespace 'xxx'.

最后,这是 XSD 的部分:

<xsd:element name="ClassA" minOccurs="0">
<xsd:complexType>
<xsd:all>
<xsd:element name="Physical" minOccurs="0">
<xsd:annotation>
<xsd:documentation>True, physical class A configuration</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="Class" type="CabinClass.type" />
<xsd:element name="Capacity" type="Integer.ctype" nillable="true" />
</xsd:sequence>
<xsd:attributeGroup ref="Array.attgroup" />
</xsd:complexType>
</xsd:element>
<xsd:element name="Saleable" minOccurs="0">
<xsd:annotation>
<xsd:documentation>Class A configuration for sales purposes</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
<xsd:element name="Class" type="CabinClass.type" />
<xsd:element name="Capacity" type="Integer.ctype" nillable="true" />
</xsd:sequence>
<xsd:attributeGroup ref="Array.attgroup" />
</xsd:complexType>
</xsd:element>
</xsd:all>
<xsd:attributeGroup ref="Container.attgroup" />
</xsd:complexType>
</xsd:element>

我的猜测是它与 xsd:sequence 的存在有关。但正如我所说,我不想修改 XSD,因为它是由数据提供者提供的,我们必须确保我们生成的 XML 完全兼容。

知道如何解决这个问题吗?

最佳答案

简化的代码可能是这样的:

public class Physical
{
[XmlElement("Capacity", typeof(int))]
[XmlElement("Class", typeof(string))]
public object[] Items { get; set; }
}

这将确保正确的反序列化,并按照元素在数组中的放置顺序给出元素的序列化。

工作版本可能如下所示:

public class Physical
{
[EditorBrowsable(EditorBrowsableState.Never)]
[XmlElement("Capacity", typeof(int))]
[XmlElement("Class", typeof(string))]
public object[] Items
{
get
{
object[] items = new object[Class.Length * 2];
for (int i = 0; i < items.Length; i += 2)
{
items[i] = Class[i / 2];
items[i + 1] = Capacity[i / 2];
}
return items;
}
set
{
Class = new string[value.Length / 2];
Capacity = new int[value.Length / 2];
for (int i = 0; i < value.Length; i += 2)
{
Class[i / 2] = (string)value[i];
Capacity[i / 2] = (int)value[i + 1];
}
}
}

[XmlIgnore]
public string[] Class { get; set; }
[XmlIgnore]
public int[] Capacity { get; set; }
}

int改为Integerctype,添加DataType参数。

同样,改变第二类。

关于c# - 如何在 C# 中的 XML 序列化期间交替 XML 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44338481/

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