作者:专情与你2602899315 | 来源:互联网 | 2023-05-24 17:52
如何解决《反序列化大型XML文档中的单个元素:由于名称空间问题,xmlSerializer.Deserialize(xmlReader.ReadSubtree())失败》经验,为你挑选了1个好方法。
我试图XmlReader
在一次传递中处理一个大的XML文档(使用a ),并使用一个反序列化其中的某些元素XmlSerializer
.
下面是一些代码和一个微小的模拟XML文档,显示了我是如何尝试这样做的.
使用的基本原理XmlReader
: 1.我正在处理非常大的XML文档(10-250 MB),因此我不想加载到内存中.所以XmlDocument
是不可能的.2.我想只提取某些元素.通常,我将能够忽略大多数其他内容.XmlReader
似乎给了我一种跳过不相关内容的有效方法.3.我不提前知道是否有任何我能应付将出现的所有元素; 因此,我没有使用一堆Xpath
/ XQuery
或LINQ到基于XML的查询,因为我只想对XML文件进行一次传递(由于它们的大小).
public class ElementOfInterest { }
…
var xml = @"
";
var reader = System.Xml.XmlReader.Create(new System.IO.StringReader(xml));
reader.ReadToFollowing("ElementOfInterest");
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(ElementOfInterest));
serializer.Deserialize(reader.ReadSubtree());
最后一行代码抛出以下内部异常:
InvalidOperationException
:" ex
未定义名称空间前缀."
显然,XmlSerializer
不识别属性值ex
内的名称空间前缀xsi:type
.
这只是我遇到的一个错误,但坦率地说,更大的问题是我不知道如何解决整个命名空间问题.我只是在寻找一种方便的方法来从XML文档中反序列化单个节点,但这似乎需要手动注册/管理命名空间,并以某种方式将它们转发XmlReader
到XmlSerializer
.
有人XmlReader
可以通过指出我的代码中的错误,或通过显示替代方法来演示如何从使用的XML文档中反序列化单个节点吗?
1> Tomalak..:
以下作品:
using System.IO;
using System.Xml;
using System.Xml.Serialization;
static void Main()
{
var xml = @"
";
var nt = new NameTable();
var mgr = new XmlNamespaceManager(nt);
mgr.AddNamespace("ex", "urn:stakx:example");
var ctxt = new XmlParserContext(nt, mgr, "", XmlSpace.Default);
var reader = XmlReader.Create(new StringReader(xml), null, ctxt);
var serializer = new XmlSerializer(typeof(ElementOfInterest));
reader.ReadToFollowing("ElementOfInterest", "urn:stakx:example");
var eoi = (ElementOfInterest)serializer.Deserialize(reader.ReadSubtree());
}
[XmlRoot(Namespace = "urn:stakx:example")]
public class ElementOfInterest { }
注意输入中的命名空间:
.