Разбор XML в стандарте C / C ++ без дополнительных библиотек - PullRequest
2 голосов
/ 14 января 2012

У меня есть XML (при условии, что он действителен), и я должен проанализировать его и сохранить в дереве.

Каков наилучший подход для его анализа без использования других библиотек, просто базовые манипуляции со строками?

Имейте в виду, что мне не нужно проверять егопросто разбери и запомни в дерево.

Ответы [ 3 ]

7 голосов
/ 14 января 2012

Базовая структура XML довольно проста:

<tagname [attribute[="value"] ...]>content</tagname>

где содержимое может содержать как обычный текст, так и другие XML-структуры или специальную форму

<tagname [attribute[="value"] ...]/>

, что эквивалентно

<tagname [attribute[="value"] ...]></tagname>

то есть. пустой контент.

Поэтому, если вам не нужно интерпретировать DTD или делать другие причудливые вещи, вы можете сделать следующее:

  1. Убедитесь, что первый непробельный символ - <. Если нет, у вас нет XML, и вы можете просто выдать ошибку и выйти.

  2. Теперь следует за именем тега до первого пробела, или до символа /, или >. Сохраните это.

  3. Если следующий непробельный символ - /, убедитесь, что за ним следует >. Если это так, вы закончили анализ и можете вернуть свой результат. В противном случае вы получили некорректный XML и можете выйти с ошибкой.

  4. Если символ >, то вы нашли конец начального тега. Теперь следует за содержанием. Продолжайте на шаге 6.

  5. В противном случае следует аргумент. Проанализируйте, сохраните результат и перейдите к шагу 3.

  6. Читайте содержимое, пока не найдете символ <.

  7. Если за этим символом следует /, это конечный тег. Убедитесь, что за ним следуют имя тега и >, и если да, верните результат. В противном случае выведите ошибку.

  8. Если вы попали сюда, вы нашли начало вложенного XML. Разобрать это с помощью этого алгоритма, а затем продолжить на 6.

6 голосов
/ 14 января 2012

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

  • независимо от того, проверяете вы это или нет, вам нужно иметь дело с ссылками на сущности, такими как &lt;, и с различными ссылками на сущности символов, такими как &#65;и &#xa;
  • простое тело документа XML является относительно простым, но заголовок представляет собой серьезную проблему, в частности DTD: есть две его версии, которые немного отличаются, и вам, вероятно, необходимо обработатьвстроенный DTD
  • даже тело не совсем тривиально из-за этих раздражающих сегментов данных символов
  • , даже без проверки вам может потребоваться поддержка ссылок на внешние сущности
  • , чтобы символы былиПринятые и / или отклоненные для различных частей XML также несколько интересны.
  • Обратите внимание, что XML определен в терминах Юникода, и правильная обработка этого также не совсем тривиальна: просто с помощью char или wchar_tпросто не обрезает.

Первая реализованная мною версия была миленькойrator намеревался выскочить все встреченные элементы.Это дало возможность легко остановить и продолжить анализ по выбору пользователя итератора.К сожалению, я не получил его при попытке скопировать с различными ссылками на сущности.Он бы хорошо и быстро разбирал простые XML-файлы, но некоторые странности в спецификации я просто не понял.

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

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

3 голосов
/ 14 января 2012

Лучший и только подход заключается в повторной реализации такой библиотеки с нуля без использования каких-либо других библиотек ...

Вы можете использоватьнапример, существующие библиотеки, такие как pugixml .Его установка так же проста, как добавление файлов в ваш проект и начало его использования.Он легкий по сравнению с другими проверяющими парсерами, такими как Xerces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...