c# - 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 反序列化为一个对象?
解决方案
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
});
推荐阅读
- javascript - 包裹中间件
- python - Spyder 启动错误的 Python 版本
- android - onPostExecute 中的空指针异常
- android - 我可以得到我的路由器的mac地址,有什么办法吗?
- javascript - Jquery全日历过滤器 - 不完全理解语句
- bundle - 根据类别页面上的默认产品显示捆绑产品默认价格
- python - Keras 模型:用于 model.fit 的相同数组未在 model.predict 中处理
- processing - 使用 Jekyll 的 p5js
- java - Spring Data Redis - 存储日期时出现问题
- java - Spring Boot App 不断创建新的数据库表