c# - 迭代大型 XML 文件并复制选择节点

标签 c# xpath

我需要遍历一个大的 XML 文件 (~2GB) 并有选择地将某些节点复制到一个或多个单独的 XML 文件。

我的第一个想法是使用 XPath 遍历匹配的节点,并为每个节点测试该节点应复制到哪些其他文件,如下所示:

var doc = new XPathDocument(@"C:\Some\Path.xml");
var nav = doc.CreateNavigator();
var nodeIter = nav.Select("//NodesOfInterest"); 
while (nodeIter.MoveNext())
{
    foreach (Thing thing in ThingsThatMightGetNodes)
    {
        if (thing.AllowedToHaveNode(nodeIter.Current))
        {
            thing.WorkingXmlDoc.AppendChild(... nodeIter.Current ...);
        }
    }
}

在此实现中,Thing 定义了 public System.Xml.XmlDocument WorkingXmlDoc 来保存它是 AllowedToHave() 的节点。不过,我不明白如何创建一个作为 nodeIter.Current 副本的新 XmlNode。

如果有更好的方法,我也很乐意听到。

最佳答案

XPath 表达式的计算要求整个 XML 文档(XML 信息集)都在 RAM 中。

对于文本表示超过 2GB 的 XML 文件,通常应该有超过 10GB 的 RAM 仅用于保存 XML 文档。

因此,虽然并非不可能,但使用另一种技术可能更可取(尤其是在必须为许多请求快速提供资源的服务器上)。

XmlReader(基于类)是适用于此场景的出色工具。它速度快,仅向前,并且不需要将读取的节点保留在内存中。此外,您的逻辑将保持几乎相同。

关于c# - 迭代大型 XML 文件并复制选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9491549/

相关文章:

c# - 如何将 2 个数据网格相互锚定?

c# - 干净的代码 : Readable Dependency Injection suggestions?

java - Android 中的 XPath 错误

xslt - 如何为有效负载 xsl 设置命名空间前缀

xml - 将多个命名空间添加到输出 XML 时出错

c# - 检测另一个进程是否启动为 "Run as Administrator"

c# - 单例模式中的双重检查锁定

c# - 生成最短的字母数字保存代码

python - 当页面中有 Unicode 时,Scrapy XPath 不正确

javascript - 在不刷新页面的情况下将变量从 JavaScript 传递到 PHP