如何从大于可用RAM的xml文件中删除xml元素/节点?

use*_*259 7 php xml

我试图弄清楚如何从php(最新版本)中非常大的xml文件中删除元素(及其子元素).

我知道我可以使用dom和simpleXml,但这需要将文档加载到内存中.

我正在查看XML编写器/阅读器/解析器函数和谷歌搜索,但似乎没有任何关于这个主题(所有答案建议使用dom或simpleXml).这不可能是正确的 - 我错过了什么吗?

我发现的最接近的是这个(C#):

您可以使用XmlReader来顺序读取您的xml(ReadOuterXml在您的情况下可能非常有用,一次读取整个节点).然后使用XmlWriter写出要保留的所有节点.(从大型XML文件中删除节点)

真?这是方法吗?我要复制整个巨大的文件?

真的没有别的办法吗?

一个approcah

如建议的那样

我可以使用phps XML阅读器或解析器读取数据,可能缓冲它,然后写入/转储+将其追加到新文件中.

但这种方法真的很实用吗?

我有将大型xml文件拆分成小块的经验,基本上使用建议的方法,并且该过程花了很长时间才能完成.

我的数据集目前还不够大,无法让我知道如何解决这个问题.我只能假设结果是相同的(一个非常缓慢的过程).

有没有人在实践中应用这个经验?

Way*_*ett 3

有几种方法可以增量处理大型文档,这样您就不需要立即将整个结构加载到内存中。无论哪种情况,您都需要写回您希望保留的元素并省略您想要删除的元素。

  1. PHP 有XMLReader一个拉解析器的实现。一个解释

    拉式解析器创建一个迭代器,该迭代器顺序访问 XML 文档中的各种元素、属性和数据。使用此迭代器的代码可以测试当前项(例如,判断它是开始元素还是结束元素,还是文本),并检查其属性(本地名称、命名空间、XML 属性值、文本值等) .),并且还可以将迭代器移动到下一项。因此,代码可以在遍历文档时从文档中提取信息。

  2. 或者您可以使用SAX XML Parser解释

    Simple API for XML (SAX) 是一个词法、事件驱动的接口,其中连续读取文档,并将其内容报告为对用户设计的处理程序对象上的各种方法的回调。SAX 实现起来既快速又高效,但很难用于从 XML 中随机提取信息,因为它往往会增加应用程序作者跟踪正在处理的文档部分的负担。

很多人更喜欢拉动方法,但这两种方法都可以满足您的要求。请记住,大是相对的。如果文档适合内存,那么使用 DOM 几乎总是会更容易。但对于非常非常大的文档来说,这可能根本不是一个选择。