我正在试图弄清楚如何从php(最新版本)中非常大的xml文件中删除元素(及其子元素)。
我知道我可以使用dom和simpleXml,但这需要将文档加载到内存中。
我正在查看XML编写器/阅读器/解析器函数和谷歌搜索,但似乎没有任何关于这个主题(所有答案建议使用dom或simpleXml)。这不可能是正确的 - 我错过了什么吗?
我发现的最接近的是这个(C#):
您可以使用XmlReader顺序读取您的xml(在您的情况下,ReadOuterXml可能对您一次读取整个节点很有用)。然后使用XmlWriter写出要保留的所有节点。 (Deleting nodes from large XML files)
真的?这是方法吗?我必须复制整个巨大的文件吗?
真的没有办法吗?
如建议的那样,
我可以使用phps XML reader或parser读取数据,可能缓冲它,然后写/ dump +将它追加到新文件中。
但这种做法真的很实用吗?
我有将大型xml文件拆分成小块的经验,基本上使用建议的方法,并且完成该过程需要很长时间。
我的数据集目前还不足以让我知道如何解决这个问题。我只能假设结果是相同的(一个非常缓慢的过程)。
有没有人有实际应用这个的经验?
答案 0 :(得分:3)
有两种方法可以逐步处理大型文档,因此您无需一次将整个结构加载到内存中。在任何一种情况下,是的,你需要写出你想要保留的元素,并省略你想要删除的元素。
PHP有一个XMLReader
implementation of a pull parser。 explanation:
拉解析器创建一个顺序访问各种迭代器的迭代器 XML文档中的元素,属性和数据。使用的代码 这个迭代器可以测试当前项目(例如,告诉你是否 它是一个开始或结束元素,或文本),并检查其属性 (本地名称,名称空间,XML属性值,文本值, 等),也可以将迭代器移动到下一个项目。代码可以 因此,当文档遍历文档时,从文档中提取信息。
或者您可以使用the SAX XML Parser。 Explanation:
Simple API for XML(SAX)是一个词汇,事件驱动的界面,其中 连续读取文档,并将其内容报告为回调 关于用户设计的处理程序对象的各种方法。 SAX是 实现快速有效,但难以用于提取 来自XML的随机信息,因为它往往会增加负担 应用程序作者跟踪文档的哪个部分 正在处理中。
很多人更喜欢拉法,但要么满足你的要求。请记住,大是相对的。如果文档适合内存,那么使用DOM几乎总是更容易。但对于真正的,非常大的文档来说,这可能不是一种选择。