尝试用Nokogiri解析来自缓冲区的多个可能不完整的XML片段



通过tcp套接字接收XML格式的消息,并尝试用Nokogiri解析它们。如果我可以在我的缓冲区中依赖一个完整的根标签,那么一切都会很简单。

小例子:

<doc><a>some long text ....</a><b>more text</b></doc>
=> #<Nokogiri::XML::Document:0x1326a30 name="document" children=[#<Nokogiri::XML::Element:0x1325fcc name="doc" children=[#<Nokogiri::XML::Element:0x1325aa4 name="a" children=[#<Nokogiri::XML::Text:0x13255f4 "some long text ....">]>, #<Nokogiri::XML::Element:0x1324f3c name="b" children=[#<Nokogiri::XML::Text:0x1324b68 "more text">]>]>]>

一切如预期

长消息可能被分成多个包,使缓冲区保留一个不完整的标签:

<doc><a>exceptionally long text ....
=> #<Nokogiri::XML::Document:0x12c45ec name="document" children=[#<Nokogiri::XML::Element:0x12c2968 name="doc" children=[#<Nokogiri::XML::Element:0x12c210c name="a" children=[#<Nokogiri::XML::Text:0x12c1cc0 "exceptionally long text">]>]>]>

仍然如预期的那样,Nokogiri::XML::SyntaxError:标记文档第1行数据过早结束,我们可以在缓冲区中等待更多的数据。

然而,短消息可以聚集在单个数据包中并立即到达:

<doc><a>text</a></doc><doc><a>other text</a></doc>
=> #<Nokogiri::XML::Document:0x1312cd8 name="document" children=[#<Nokogiri::XML::Element:0x1312814 name="doc" children=[#<Nokogiri::XML::Element:0x1312594 name="a" children=[#<Nokogiri::XML::Text:0x1312288 "text">]>]>]>

第二条消息未解析,Nokogiri::XML::SyntaxError:文档末尾的额外内容。

我看不出有任何方法可以让Nokogiri返回给我额外的内容,所以我可以尝试继续解析。这可能是底层libxml2或Nokogiri与库的接口的限制。字符串。scan不提供字符串索引(拆分消息并保留额外的文本)和Regexp。Match不会全局匹配。关于如何最好地从我的缓冲区中提取所有完整的消息并留下不完整的消息,有什么想法吗?

Nokogiri期望一个IO流或字符串。Nokogiri::HTML::Document.parseNokogiri::XML::Document.parse的文档

parse(string_or_io, url = nil, encoding = nil, options = XML::ParseOptions::DEFAULT_HTML)

解析HTML。thing可以是String,也可以是任何响应读和关闭的对象,如IO或StringIO。

"thing"实际上应该是"string_or_io",以匹配他们的例子,但是你明白了。

如果你能添加更多关于你如何检索内容和解析它的信息,我们可能能够提供更多的帮助。

您可以尝试Nokogiri::XML::SAX::PushParser来完成此操作。

见http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/SAX/PushParser

相关内容

  • 没有找到相关文章

最新更新