python 处理无限XML
我正在开发一个应用程序,我的工作就是为这个应用程序做一个示例的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解析线程完成时,你的主程序可以先休眠。
7
这是我用来解析从远程计算机获取的无尽XML流的方法(在我的例子中,我是通过一个套接字连接的,并使用socket.makefile('r')来创建文件对象)
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()