如何通过XmlSerializer将任何xml元素反序列化为列表?

时间:2015-12-04 12:00:48

标签: c# xml xml-serialization

我想反序列化以下xml文档:

<?xml version="1.0" encoding="utf-8"?>
<ExtensionFileTypes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Group>
    <Item1>value 1</Item1>
    <Item2>value 2</Item2>
    <Item3>value 3</Item3>
    [ more items ... ]
  </Group>
</ExtensionFileTypes>

本文档应解析为以下c#类:

public class ExtensionFileTypes
{
    [XmlArrayItem("Item*")]
    public List<string> Group = new List<string>();
}

类属性[XmlArrayItem("Item*")]的参数中的通配符演示了我要归档的内容:将xml元素<Item*>传递给我的c#列表。

我使用XmlSerializer反序列化xml文档:

public static void ReadXML(string pFilename)
{
    XmlSerializer lXmlSerializer = new XmlSerializer(typeof(ExtensionFileTypes));

    lXmlSerializer.UnknownElement += new XmlElementEventHandler(XmlSerializer_UnknownNode);

    FileStream lFileStream = new FileStream(pFilename, FileMode.Open);
    ExtensionFileTypes lExtensionFileTypes = (ExtensionFileTypes)lXmlSerializer.Deserialize(lFileStream);

    var lFoo = lExtensionFileTypes; // 0 Items in Group
}

问题:lFoo包含0 <Item*>个元素:

enter image description here

我如何获得这些元素?

1 个答案:

答案 0 :(得分:1)

不幸的是,ElementName不能包含通配符。如果Item元素的数量有限,例如,只有Item1Item2Item3,那么您可以多次应用XmlArrayItem属性。如果Item元素的数量很大,您可以使用Regex提前处理文档,将所有Item*代码更改为Item

string updatedXmlString = Regex.Replace(xmlString, "<(/?)Item[0-9]+>", "<$1Item>");

现在你可以简单地写一下:

public class ExtensionFileTypes
{
    [XmlArrayItem("Item")]
    public List<string> Group = new List<string>();
}

如果你不能对xml应用预处理,那么你总是可以手动解析它或实现IXmlSerializable接口。