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

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

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

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

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

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

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

真的没有其他办法吗?

一个好处

如所暗示的,

我可以使用phps XML阅读器或解析器读取数据,可能将其缓存,然后将/ dump +附加到新文件中。

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

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

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

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


有两种方法可以逐渐处理大文档,因此不需要一次将整个结构加载到内存中。 无论哪种情况,是的,您需要将您希望保留的元素写回,并省略您想要删除的元素。

  • PHP有一个Pull解析器的XMLReader实现。 一个解释:

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

  • 或者你可以使用SAX XML解析器。 说明:

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

  • 很多人更喜欢拉式方法,但要么符合您的要求。 请记住,大是相对的。 如果文档适合内存,那么使用DOM几乎总是更容易。 但是,真正的,非常大的文件可能不是一种选择。

    链接地址: http://www.djcxy.com/p/11109.html

    上一篇: How to delete xml elements/nodes from xml file larger than available RAM?

    下一篇: Which Table/Grid Control in WPF?