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

How can I deserialize any xml element to a list via the XmlSerializer?

我想反序列化以下 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# class:

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

class 属性 [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*> 个元素:

如何获取这些元素?

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

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

现在你可以简单地写:

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

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