python 处理无限XML

5 投票
7 回答
2126 浏览
提问于 2025-04-16 01:31

我正在开发一个应用程序,我的工作就是为这个应用程序做一个示例的Python接口。这个应用程序可以提供基于XML的文档,我可以通过HTTP的Get方法获取这个文档。但是问题是,这个XML文档是无穷无尽的,也就是说它没有结束的标记。我知道这个文档应该用SAX来处理,但我该如何解决这个无穷的问题呢?有没有什么想法或者示例代码?

7 个回答

2

如果文档中的某个元素没有关闭标签,那么这个文档就不是正确的XML格式,这样会对任何XML解析器造成麻烦。

不过,使用Python的SAX2 API似乎是最好的方法,但你需要弄清楚缺少关闭标签时会抛出什么异常,然后自己捕捉并处理这个异常。

补充说明

假设你收到了一个这样的XML文档:

<? xml version="1.0" ?>
<foo>
  <bar>...</bar>
  <bar>...</bar>
  <bar>...</bar>
  <bar>...</bar>
  ...

而你从来没有收到过关闭标签</foo>。在这种情况下,SAX解析器在处理bar元素时,会不断发出startElement(bar)endElement(bar)的事件。你可能会把开始和结束之间的所有数据收集起来,然后在看到结束事件时一次性处理这些数据。

要停止这个循环,唯一的方法就是采取外部措施:提前定义要处理的bar元素的数量,或者提前定义你想花多少时间来接收bar事件。可以在一个线程中运行SAX解析器,当达到你的限制时就结束这个线程。在等待SAX解析线程完成时,你的主程序可以先休眠。

3

看看 jabberpy 里的 xmlstream 模块(也可以在 twisted 找到):

xmlstream.py 提供了简单的功能,用于实现基于 XML 流的网络协议。它是 jabber.py 的基础。

xmlstream.py 负责管理网络连接和流中的 XML 解析。当一个完整的“协议元素”(也就是 XML 流根节点的一个完整子节点)被解析出来时,会调用 dispatch 方法,并传入这个结构的“节点”实例。 Node 类是一个非常简单的 XML DOM 类,用于操作 XML 文档或在这里说的“协议元素”。

7

这是我用来解析从远程计算机获取的无尽XML流的方法(在我的例子中,我是通过一个套接字连接的,并使用socket.makefile('r')来创建文件对象)

19.12.2. 增量解析器对象

parser = xml.sax.make_parser(['xml.sax.IncrementalParser'])
handler = FooHandler()
parser.setContentHandler(handler)

data = sockfile.readline()
while ( len(data) != 0 ):
    parser.feed(data)
    data = sockfilefile.readline()

撰写回答