C#XML-将列表中的各个子项序列化为xml属性

时间:2017-09-13 13:42:27

标签: c# xml

我正在尝试创建一个通用类结构,以将包含各种子项的列表作为XML属性保存在xml文件中。每个子项都有Name(字符串)和Value(double)。

一个例子: 两个列表的XML - 第1帧和第2帧 - 应如上所示。 frame1是类rec的列表。类rec始终包含多对参数及其值。在frame1中,类rec包含参数car,factory和height。并在frame2书和页面。

    <frame1>
      <rec car="0" factory="1" height="2" />
      <rec car="1" factory="4" height="2" />
      <rec car="2" factory="4" height="3" />
      <rec car="3" factory="5" height="2" />
    </frame1>
    <frame2>
      <rec book="0" page="1" />
      <rec book="1" page="4" />
      <rec book="2" page="4" />
      <rec book="3" page="5" />
    </frame2>

这只是一个例子。我不想为每个“框架”列表创建具有不同属性的不同类。我想用一个类“rec”解决问题,因为子项目总是在变化。有没有办法创造这个?

提前谢谢

1 个答案:

答案 0 :(得分:0)

我认为您可以使用这样的代码:listsobject[][],因此不需要任何通用类型。

using System.Xml.Linq;

...

var lists = new[]
                {
                    new object[]
                        {
                            new ClassA("0", "1", "2"), new ClassA("1", "4", "2"), new ClassA("2", "4", "3"),
                            new ClassA("3", "5", "2"),
                        },
                    new object[]
                        {
                            new ClassB("0", "1"), new ClassB("1", "4"), new ClassB("2", "4"),
                            new ClassB("3", "5"),
                        }
                };

var xml = new XDocument(new XElement("Root"));
for (var i = 0; i < lists.Length; i++)
{
    var eFrame = new XElement($"frame{i}");
    var list = lists[i];
    foreach (var obj in list)
    {
        var eRec = new XElement("rec");
        var props = obj.GetType().GetProperties();
        foreach (var prop in props)
        {
            eRec.SetAttributeValue(prop.Name, prop.GetValue(obj).ToString());
        }

        eFrame.Add(eRec);
    }

    xml.Root.Add(eFrame);
}

结果将类似xml对象:

<Root>
  <frame0>
    <rec car="0" factory="1" height="2" />
    <rec car="1" factory="4" height="2" />
    <rec car="2" factory="4" height="3" />
    <rec car="3" factory="5" height="2" />
  </frame0>
  <frame1>
    <rec book="0" page="1" />
    <rec book="1" page="4" />
    <rec book="2" page="4" />
    <rec book="3" page="5" />
  </frame1>
</Root>