我正在优化自定义对象 -> XML 序列化实用程序,一切都已完成并正常工作,这不是问题。
它的工作原理是将文件加载到XmlDocument
对象,然后递归地遍历所有子节点。
我想也许使用XmlReader
而不是有XmlDocument
加载/解析整个内容会更快,所以我也实现了该版本。
算法完全相同,我使用包装类来抽象处理处理的功能XmlNode
vs. an XmlReader
。例如,GetChildren
方法yield返回一个子元素XmlNode
或子树XmlReader
.
因此,我编写了一个测试驱动程序来测试这两个版本,并使用了一个重要的数据集(一个包含大约 1,350 个元素的 900kb XML 文件)。
然而,使用 JetBrains dotTRACE,我发现XmlReader
版本实际上比XmlDocument
版本!似乎涉及一些重要的处理XmlReader
当我迭代子节点时读取调用。
所以我说这么多就是为了问这个:
有什么优点/缺点XmlDocument
and XmlReader
,在什么情况下应该使用其中之一?
我的猜测是存在一个文件大小阈值XmlReader
性能变得更加经济,并且内存占用也更少。然而,该阈值似乎高于 1MB。
我正在打电话ReadSubTree
每次处理子节点:
public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
XmlReader xr = myXmlSource.ReadSubtree ();
// skip past the current element
xr.Read ();
while (xr.Read ())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
该测试适用于单个级别的许多对象(即宽和浅) - 但我想知道效果如何XmlReader
当 XML 又深又广时,费用如何? IE。我正在处理的 XML 很像一个数据对象模型,1 个父对象到许多子对象,等等:1..M..M..M
我事先也不知道我正在解析的 XML 的结构,因此我无法对其进行优化。