gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:40:14 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com