Анализ и использование XML

Я создаю соответствующий и проверяющий синтаксический анализатор XML на С++ и пытаюсь сделать его легким для использования в карманном компьютере.

Вначале я решил добавить в свой парсер какие-то "события", как это делает SAX, информирующие об элементах, инструкциях по обработке и т.д.

Эти события принимаются производным классом, который строит дерево DOM XML.

Мои сомнения появляются при попытке обрабатывать в основном объекты (которые могут содержать элементы, пи и комментарии внутри, если они определены) и их разрешение.

Например, я могу создать класс XMLEntityRef, который ссылается на некоторый объект XMLEntity, определенный в некотором объекте XMLDocType, как это делает парсер .NET system.xml.

Насколько я знаю, для большинства целей приложению необходимо знать элемент, его содержимое, его соответствующие атрибуты и их соответствующие значения... только строки... ему все равно, сформировано ли содержимое элемента объектами cdata, ссылками на сущности и/или обычный текст... то же самое относится и к значениям атрибутов.

Итак, мой вопрос заключается в следующем: в чем преимущество передачи приложению каждого объекта xml в том виде, в котором он появляется, и предоставления ему (или вспомогательному классу) возможности создавать, например, значение результирующего атрибута путем объединения текстов и разрешенных ссылок на сущности?

Если я делаю опрос, пожалуйста, ответьте: нужно ли вашему приложению знать о тегах cdata и о том, где они находятся в xml-файле, или вы упрощаете задачу... вы хотите знать полное значение содержимого элемента в строку, не беспокоясь о том, как она построена?

С уважением, Мауро Х. Легьери


person Mauro H. Leggieri    schedule 28.11.2009    source источник


Ответы (3)


Я создаю соответствующий и проверяющий синтаксический анализатор XML на С++ и пытаюсь сделать его легким.

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

нужно ли вашему приложению знать о тегах cdata и о том, где они расположены в xml файле

Обычно нет. DOM Level 3 LS требует, чтобы разделы CDATA по умолчанию хранились в узлах CDATASection в DOM, но почти ни одно приложение не заботится об этом.

(Если вопрос касается моего приложения, то да, потому что мое приложение — это система шаблонов, которая сохраняет разделы CDATA там, где они были. Но все же.)

Мои сомнения появляются при попытке обрабатывать в основном объекты

Боже да. Ссылки на сущности — это полная катастрофа. Заставить реализацию DOM поддерживать их таким образом, чтобы он был совместим с DOM уровня 3 Core/LS, очень сложно. Избегайте, если это вообще возможно.

person bobince    schedule 29.11.2009
comment
Ну... с облегчением я пытался визуализировать разницу кода в некоторых реализациях. Код Xerces (за исключением материалов ввода-вывода и т. д.) больше, чем реализация system.xml в mono.net. Но, как вы говорите, можно создать парсер, полностью совместимый с dom level 3. Ну... какое приложение действительно использует структуру dom l3, за исключением редактора xml? - person Mauro H. Leggieri; 29.11.2009
comment
Очень мало, но, к сожалению, вам придется реализовывать большую часть запутанного DTD, чтобы получить хотя бы минимально соответствующий парсер XML. Жаль, что XML вытащил так много бесполезной чепухи DTD из SGML; Я бы хотел, чтобы было стандартное упрощенное подмножество XML для облегченной работы, отбрасывание всего материала doctype (вместе с атрибутами по умолчанию и всеми сущностями) и разрешение объявлений пространств имен только для корневого элемента. - person bobince; 30.11.2009
comment
да... должна существовать облегченная спецификация... спасибо - person Mauro H. Leggieri; 01.12.2009

вообще xml не легкий вес. Вам лучше с JSON.

person prime_number    schedule 28.11.2009
comment
да, потому что json-библиотеки для C/C++ настолько хороши... В веб-разработке я с вами согласен на 10000%. По другим предметам? ммм, не очень. - person elcuco; 29.11.2009
comment
Кто сказал что-нибудь о библиотеках? Он все равно хочет исправить свое собственное. Кроме того, данные есть данные. Будь то веб-разработка или другие темы. XML и JSON — это просто способ формального определения данных, которые вы передаете. - person prime_number; 29.11.2009

Я не думаю, что при построении синтаксического анализатора вы должны что-либо предполагать о том, как приложения будут использовать xml, а скорее предоставить наиболее детализированный уровень данных для каждого узла xml, чтобы обеспечить максимальную гибкость. Хотя это может потребовать дополнительной работы со стороны потребляющих приложений, они смогут выполнять все, что им нужно. Удачи.

person bill seacham    schedule 29.11.2009