有什么方法可以为一个类定义多个元素名称吗?
我的根类
[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/