我想反序列化以下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*>
个元素:
我如何获得这些元素?
答案 0 :(得分:1)
不幸的是,ElementName
不能包含通配符。如果Item
元素的数量有限,例如,只有Item1
,Item2
,Item3
,那么您可以多次应用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
接口。