Получение сообщений в формате 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 не будет совпадать глобально.Любые идеи о том, как лучше всего извлечь все полные сообщения из моего буфера и оставить завершающий неполный?