7

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

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

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

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

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

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

真的没有别的办法了吗?

一种方法

正如建议的那样,

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

但这种方法真的实用吗?

我有将巨大的 xml 文件拆分成更小的部分的经验,基本上是使用建议的方法,并且这个过程需要很长时间才能完成。

我的数据集目前还不够大,无法让我了解这将如何解决。我只能假设结果是一样的(一个非常缓慢的过程)。

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

4

1 回答 1

3

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

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

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

  2. 或者您可以使用SAX XML Parser说明

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

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

于 2012-08-11T22:02:07.593 回答