![](/img/trans.png)
[英]Can I fail to deserialize with XmlSerializer in C# if an element is not found?
[英]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
元素的数量受到限制,例如,只有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
接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.