我需要遍历一个大的 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/