我正在开发一个应用程序,我的工作就是为应用程序开发一个示例Python接口.应用程序可以提供基于XML的文档,我可以通过HTTP Get方法获取文档,但问题是基于XML的文档是无穷无尽的,这意味着将没有end元素.我知道该文件应由SAX处理,但如何处理无穷无尽的问题?有什么想法,示例代码?
这是我用来解析从远程计算机获取的无限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()
Run Code Online (Sandbox Code Playgroud)
如果文档从未获得文档中元素的结束标记,那么它就不是正确形成的 XML,这会对任何 XML 解析器造成严重破坏。
也就是说,使用 Python SAX2 API 似乎是最好的方法,但您必须确定缺少的关闭标记将引发什么异常,捕获它并自行处理。
添加
假设您收到如下 XML 文档:
<? xml version="1.0" ?>
<foo>
<bar>...</bar>
<bar>...</bar>
<bar>...</bar>
<bar>...</bar>
...
Run Code Online (Sandbox Code Playgroud)
而且你永远不会收到结束语</foo>。在这种情况下,对元素做出反应的 SAX 解析器将发出和bar的事件流。据推测,您将收集开始和结束之间的所有数据,然后在看到结束事件后一次性处理所有数据。 startElement(bar)endElement(bar)
停止此循环的唯一方法是通过外部操作:提前定义bar要处理的元素数量,或提前定义要用于接收bar事件的时间量。在线程中运行 SAX 解析器,然后在达到限制时终止该线程。您需要让主进程休眠,同时等待 sax 解析器线程完成。