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

时间:2012-08-11 21:27:35

标签: php xml

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

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

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

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

  

您可以使用XmlReader顺序读取您的xml(在您的情况下,ReadOuterXml可能对您一次读取整个节点很有用)。然后使用XmlWriter写出要保留的所有节点。   (Deleting nodes from large XML files

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

真的没有办法吗?

一个approcah

如建议的那样,

我可以使用phps XML reader或parser读取数据,可能缓冲它,然后写/ dump +将它追加到新文件中。

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

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

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

有没有人有实际应用这个的经验?

1 个答案:

答案 0 :(得分:3)

有两种方法可以逐步处理大型文档,因此您无需一次将整个结构加载到内存中。在任何一种情况下,是的,你需要写出你想要保留的元素,并省略你想要删除的元素。

  1. PHP有一个XMLReader implementation of a pull parserexplanation

      

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

  2. 或者您可以使用the SAX XML ParserExplanation

      

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

  3. 很多人更喜欢拉法,但要么满足你的要求。请记住,大是相对的。如果文档适合内存,那么使用DOM几乎总是更容易。但对于真正的,非常大的文档来说,这可能不是一种选择。