C# XML序列化 - 动态元素名称

3

我的当前XML结构如下:

<Parent>
 <Child>
   <Line id="1">Something</Line>
   <Line id="2">Something</Line>
 </Child>
 <Child>
   <Line id="1">Something else</Line>
   <Line id="2">Something else</Line>
 </Child>
</Parent>

父类代码包含属性:

[XmlElement("Child")]
public List<Child> Childrens { get; set; }

现在我想要将其更改为:
<Parent>
 <Child>
   <Line id="1">Something</Line>
   <Line id="2">Something</Line>
 </Child>
 <SpecialChild>
   <Line id="1">Some other text</Line>
   <Line id="2">Some other text</Line>
 </SpecialChild>
</Parent>

比如说,当 Child 设置了一些特殊的标志时,它的名称应该更改,并打印一些其他文本。根据标志,Child已经知道要打印哪个文本。

但现在最好的选项是改变元素名称吗?


我会在子元素上添加一个属性,比如类型:Normal(普通)、Special(特殊)。<Child type="Normal" and <Child type="Special". https://www.codeproject.com/Questions/1029113/Adding-XMl-Element-node-attributes-dynamically-in. 否则,你需要在序列化过程中以不同的方式处理这种类型的元素。 - Razvan Dumitru
1个回答

5

我认为您可以在此使用继承:

[XmlElement("Child", typeof(Child))]
[XmlElement("SpecialChild", typeof(SpecialChild))]
public List<Child> Childrens { get; set; }

使用

public class SpecialChild : Child {...}

然而,在没有继承的情况下,它不是本地支持的,您需要执行手动序列化。
编辑:经确认,可以正常工作。
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
class Program
{    static void Main()
    {
        var ser = new XmlSerializer(typeof(Parent));
        var obj = new Parent
        {
            Childrens = {
                new Child { },
                new SpecialChild { },
            }
        };
        ser.Serialize(Console.Out, obj);
    }
}
public class Parent
{
    [XmlElement("Child", typeof(Child))]
    [XmlElement("SpecialChild", typeof(SpecialChild))]
    public List<Child> Childrens { get; } = new List<Child>();
}
public class Child { }
public class SpecialChild : Child { }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接