如何通过 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
元素的个数有限,比如只有Item1
、Item2
、Item3
,那么可以多次应用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
接口。
我想反序列化以下 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
元素的个数有限,比如只有Item1
、Item2
、Item3
,那么可以多次应用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
接口。