Попытка разобрать несколько, возможно, неполных фрагментов XML из буфера с помощью Nokogiri - PullRequest
1 голос
/ 09 апреля 2011

Получение сообщений в формате XML через сокет tcp и попытка их проанализировать с помощью 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: Дополнительный контентв конце документа.

Я не вижу способа заставить Нокогири вернуть мне дополнительный контент, чтобы я мог попытаться продолжить синтаксический анализ.Это может быть ограничением базового интерфейса libxml2 или Nokogiri с библиотекой.String.scan не предоставляет строковые индексы (для разделения сообщений и сохранения лишнего текста), а Regexp.match не будет совпадать глобально.Любые идеи о том, как лучше всего извлечь все полные сообщения из моего буфера и оставить завершающий неполный?

Ответы [ 2 ]

0 голосов
/ 23 августа 2017

Вы можете попробовать Nokogiri::XML::SAX::PushParser, чтобы выполнить это.

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

0 голосов
/ 09 апреля 2011

Нокогири ожидает IO-поток или строку. Из документов на Nokogiri::HTML::Document.parse и Nokogiri::XML::Document.parse.

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

Разбор HTML. вещь может быть строкой или любым объектом, который реагирует на чтение и закрытие, таким как IO или StringIO.

"вещь" на самом деле должна быть "string_or_io", чтобы соответствовать их примеру, но вы поняли идею.

Если вы сможете добавить больше информации о том, как вы извлекаете контент и анализируете его, мы могли бы оказать дополнительную помощь.

...