gpt4 book ai didi

C# Xmlserializer/XmlElement 不同的名字

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:58 30 4
gpt4 key购买 nike

有什么方法可以为一个类定义多个元素名称吗?

我的根类

[XmlRoot("part")]
public partial class TERMINAL_Part
{
public partTerminal terminal { get; set; }

[XmlAttribute("id")]
public string id { get; set; }

[XmlAttribute("version")]
public string version { get; set; }

}

我不工作的终端子类

public partial class partTerminal
{

[XmlElement("round")]
[XmlElement("hf")]
[XmlElement("box")]
public partTerminalType Type { get; set; }

}

我的 XML 文件。这里我们有不同的子元素(hf、round、box、...)但是所有的子元素都有相同的子元素。

XML 文件 1

<terminal>
<hf>
<part_number>4E0_035_603</part_number>
</hf>
</terminal>

XML 文件 2

<terminal>
<round>
<part_number>4E0_035_603</part_number>
</round>
</terminal>

XML 文件 3

<terminal>
<box>
<part_number>4E0_035_603</part_number>
</box>
</terminal>

最佳答案

您可以使用 [XmlChoiceIdentifier] attribute以支持 XML 文件的不同变体。这有点复杂,但这里有一个示例实现供您使用。基本上,我们将为不同的元素名称添加一个 enum,并向您的 partTerminal 添加一个附加属性以标记要使用的特定名称。 (但它不会在 XML 中可见)

首先,您的 partTerminal 将如下所示:

public partial class partTerminal
{
[XmlChoiceIdentifier("TerminalType")]
[XmlElement("round")]
[XmlElement("hf")]
[XmlElement("box")]
public partTerminalType Type { get; set; }

[XmlIgnore]
public TerminalChoiceType TerminalType { get; set; }
}

请注意添加了 TerminalType[XmlChoiceIdentifier]。在 TerminalType 上使用 [XmlIgnore] 可确保它不会包含在您的 XML 文件中。

我们还需要添加 TerminalChoiceType 枚举,如下所示:

public enum TerminalChoiceType
{
round,
hf,
box
}

您现在可以正常序列化/反序列化它。请注意,您可以辨别 XML 文件中使用了哪种标记,因为 TerminalType 将自动设置为相应的值。反之亦然,在序列化时,如果您希望将其写为 box 值,只需设置 TerminalType = TerminalChoiceType.box,序列化器就会遵守这一点。

关于C# Xmlserializer/XmlElement 不同的名字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32227499/

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