原文 www.cnblogs.com/mgen/archive/2011/12/12/2284554.html
众所周知XML是可以扩展的,XML的元素可以靠名称识别而不是只按照未知识别。在 XML反序列化的时候只要需要的信息存在就可以成功将XML数据转化成反序列化后的对象。但是这并不代表着用来反序列化的XML数据就一定是序列化的标准 结果。有些时候XML数据会有多余冗长信息,这个在反序列化的过程中默认是不会被觉察到的。
XmlSerializer类型有三个事件可以觉察到未知XML节点:UnknownNode,UnknownElement和UnknownAttribute。分别对应未知节点,未知元素和未知属性。注意XML元素和XML属性都属于XML节点。
比如这个类型:
publicclassWorker
{
publicint Id;
[XmlAttribute]
publicbool Retired;
}
本只包括一个元素(Id)和属性(Retired),但XML数据中还有其他冗长信息:
<?xmlversion="1.0"encoding="utf-8" ?>
<Workerxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Retired="false"
Department="sales">
<Name>Mgen</Name>
</Id>
</Worker>
注册XmlSerializer的相应事件然后反序列化操作:
var xmlSerializer =newXmlSerializer(typeof(Worker));
xmlSerializer.UnknownNode += (sender, e) =>
{
Console.WriteLine("未知节点:{0} 行{1} 列{2}", e.Name, e.LineNumber, e.LinePosition);
};
xmlSerializer.UnknownAttribute += (sender, e) =>
{
Console.WriteLine("位置属性:{0} 行{1} 列{2}", e.Attr.Name, e.LineNumber, e.LinePosition);
};
xmlSerializer.UnknownElement += (sender, e) =>
{
Console.WriteLine("位置元素:{0} 行{1} 列{2}", e.Element.Name, e.LineNumber, e.LinePosition);
};
//反序列化XML文件
var worker = (Worker)xmlSerializer.Deserialize(File.OpenRead("xmlfile.xml"));
输出:
未知节点:Department 行5 列21
位置属性:Department 行5 列21
未知节点:Name 行7 列6
位置元素:Name 行7 列6