python处理无尽的XML

Chr*_*ris 5 python xml

我正在开发一个应用程序,我的工作就是为应用程序开发一个示例Python接口.应用程序可以提供基于XML的文档,我可以通过HTTP Get方法获取文档,但问题是基于XML的文档是无穷无尽的,这意味着将没有end元素.我知道该文件应由SAX处理,但如何处理无穷无尽的问题?有什么想法,示例代码?

get*_*kha 6

这是我用来解析从远程计算机获取的无限xml流(在我的情况下,我通过套接字连接并使用socket.makefile('r')来创建文件对象)

19.12.2.IncrementalParser对象

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.sax.IncrementalParser”这样的符号,而“make_parser”需要一个具有“create_parser”功能的模块列表。有`xml.sax.xmlreader.IncrementalParser`,但它没有实现`feed`,只是一个接口。幸运的是,“make_parser”在加载用户提供的模块失败后尝试加载的默认解析器模块“xml.sax.expatreader”实现了“xml.sax.xmlreader.IncrementalParser”。因此,不带参数调用 `make_parse` 就足够了。 (3认同)

Cra*_*der 2

如果文档从未获得文档中元素的结束标记,那么它就不是正确形成的 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 解析器线程完成。