首页 > 解决方案 > C# 在忽略命名空间的同时反序列化 xml

问题描述

我必须将 Xml 文件加载并反序列化为对象。我可以读取 xml,到达描述对象的位置并仅从该部分解析 xml,这很好,但是在 xml 的根中声明了一个命名空间。

我不明白为什么,但是在读取 xml 时,即使我从给定节点读取它,也会将 xmlns 属性添加到其中,导致我的程序由于意外成员而无法将其反序列化为对象。

我的代码:

public static SomeClass GetObjectFromXml (string path)
    {
        XmlReader reader = XmlReader.Create(path);
        string wantedNodeContents = string.Empty;
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element && reader.Name == "IWantThis")
            {
                wantedNodeContents = reader.ReadOuterXml();
                break;
            }
        }
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(SomeClass));
        System.IO.StringReader stringReader = new System.IO.StringReader(wantedNodeContents);
        SomeClass loadedSomeClassXml = xmlSerializer.Deserialize(stringReader) as SomeClass;
        return loadedSomeClassXml;
    }

我怎样才能摆脱 xmlns 并将 xml 反序列化为一个对象?

标签: c#xmlxml-deserialization

解决方案


XDocument 在反序列化任何 XML 时为您提供了更多的灵活性。我有一个类似的问题,它是使用下一个代码段解决的:

///Type T must have a default constructor

private T XMLToObject (string pathXML)
{
   T myObjectParsedFromXML= default(T);

   LoadOptions loadOpt = LoadOptions.SetLineInfo;
   XDocument xmlDocument = XDocument.Load(pathXML , loadOpt);

   string namespaceXML = xmlDocument.Root.Name.Namespace.NamespaceName;
   XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace: namespaceXML); 
   
   XmlReader XMLreader = xmlDocument.CreateReader();

   myObjectParsedFromXML= (T)serializer.Deserialize(XMLreader);   
   
   return myObjectParsedFromXML;
}

此外,XmlSerializer 为您提供了一组事件,用于在序列化过程中注册任何问题或错误:

 XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace: namespaceXML);
 
 serializer.UnknownAttribute += new XmlAttributeEventHandler((sender, args) =>
            {
                //Your code for manage the errors during serialization
            });

 serializer.UnknownElement += new XmlElementEventHandler((sender, args) =>
            {  
               //Your code for manage the errors during serialization  
            });


推荐阅读