Фильтрация ошибок пространства имен при разборе частичного XML через libxml2 в C ++ - PullRequest
3 голосов
/ 13 июля 2010

У меня есть необходимость проанализировать частичные фрагменты XML (которые представлены как std :: string), такие как этот:

<FOO:node>val</FOO:node>

как xmlDoc объектов в libxml2и поскольку это фрагменты, я продолжаю выводить ошибки namespace error : Namespace prefix FOO on node is not defined в STDERR.

Я ищу либо способ фильтрации только этих предупреждений пространства имен, либо синтаксический анализ фрагмента XML прямо вxmlNode объект.

Я думаю, что какой-то взлом с initGenericErrorDefaultFunc () может быть для того, чтобы пойти первым путем, но документация для libxml2 абсолютно зверская.

Я бы сказалчестно говоря, предпочитаю использовать второй подход, потому что он не требует взлома ошибок, и узел уже будет знать о пространстве имен, но я не думаю, что это возможно, потому что узел должен иметь корень, а фрагменты XML не гарантированно имеюттолько один корень.

Мне просто нужно несколько советов о том, как избавиться от предупреждения об ошибке в пространстве имен.

Спасибо, веру очень много.

Ответы [ 2 ]

3 голосов
/ 26 августа 2010

Опираясь на то, что сказал @Potatoswatter ... вы можете создать контекст для фрагментов?Например, конкатенация

<dummyRoot xmlns:FOO="dummy-URI">

перед вашим фрагментом, а затем

</dummyRoot>

, затем передача конкатенированной строки в xmlParseMemory ().

В качестве альтернативы, почему don 't вы используете xmlParseInNodeContext (), который позволяет вам передать узел для использования в качестве контекста (включая пространства имен), а содержимое может быть любым хорошо сбалансированным блоком (например, несколькими элементами без единого корневого элемента).

ЛюбойМетод требует, чтобы вы знали или могли сканировать, чтобы выяснить, набор всех возможных префиксов пространства имен, которые может использовать фрагмент.

0 голосов
/ 25 августа 2010

Не возможно ли передать xmlParserOptions XML_PARSE_NOERROR и / или XML_PARSE_NOWARNING в анализатор?

...