繁体   English   中英

如何通过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#类:

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*>元素:

在此处输入图片说明

如何获得这些元素?

不幸的是, 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接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM