格式化包含反序列化列表的XML

时间:2016-09-07 16:26:19

标签: c# xml serialization xml-serialization xmlserializer

我需要通过我目前正在处理的C#应用​​程序将一些数据从XML文件带到PostgreSQL数据库。

我现在面临的问题是我现在需要在XML中添加某种列表。目前它看起来像这样:

<itemOne>stuff</itemOne>
<itemTwo>otherStuff</itemTwo>
<listOfItems>
    <listItem>
        <partOne>123</partOne>
        <partTwo>abc</partTwo>
    </listItem>
    <listItem>
        <partOne>123</partOne>
        <partTwo>abc</partTwo>
    </listItem>
</listOfItems>

所以我找到了一些线程来处理如何反序列化列表的主题。但他们都开始说应该修改提议的XML。由于我在这方面拥有我所希望的所有自由,我想首先创建一个最佳的XML格式。

好吧,然后反序列化它。因此,如果有任何由XmlSerializer.Deserialize()自动处理的列表格式,那就太棒了。

1 个答案:

答案 0 :(得分:1)

只要该类的形状匹配,XmlSerializer就会自动处理该数据。例如:

[XmlRoot("yourRootName")]
public class Foo {
    [XmlElement("itemOne")] public string A {get;set;}
    [XmlElement("itemTwo")] public string B {get;set;}

    [XmlArray("listOfItems")]
    [XmlArrayItem("listItem")]
    public List<Bar> Bars {get;set;}
}
public class Bar {
    [XmlElement("partOne")] public int C {get;set;}
    [XmlElement("partTwo")] public string D {get;set;}
}

当然,如果是我,我会想要简洁,但是:

<betterName foo="stuff" blab="otherStuff">
     <nameMe a="123" b="abc"/>
     <nameMe a="456" b="def"/>
</betterName>

只需要一些最小的改动:

[XmlRoot("betterName")]
public class Foo {
    [XmlAttribute("foo")] public string A {get;set;}
    [XmlAttribute("bar")] public string B {get;set;}

    [XmlElement("nameMe")]
    public List<Bar> Bars {get;set;}
}
public class Bar {
    [XmlAttribute("a")] public int C {get;set;}
    [XmlAttribute("b")] public string D {get;set;}
}