Создание XML в коде C ++ - PullRequest
       28

Создание XML в коде C ++

9 голосов
/ 29 января 2009

В моем проекте есть ситуации, когда мы должны отправлять сообщения xml (как char *) между модулями Они не очень большие, всего 10-15 строк. Прямо сейчас все сами создают строку. Я не думаю, что это правильный подход. Мы уже используем библиотеку xerces DOM. Так почему бы не создать дерево Dom, не сериализовать его, а затем отправить его.

Что вы, ребята, предлагаете?

Ответы [ 10 ]

6 голосов
/ 29 января 2009

Если вы на самом деле просто создаете небольшие сообщения XML, Xerces - это излишество, ИМХО. Это библиотека синтаксического анализатора, и вы ничего не анализируете.

3 голосов
/ 30 января 2009

Быстро и просто, попробуйте TinyXml API:
http://www.grinninglizard.com/tinyxml/

3 голосов
/ 30 января 2009

Вы можете использовать DOM или написать собственную небольшую платформу для генерации XML C ++.

API Xerces был перенесен из Java, и с помощью области действия объекта вы можете сделать генерацию XML из кода C ++ еще проще:

XmlWriter w;
Elem book = w.Element("book");
book.addAttrib("title", "Lord of the Rings");
Elem author = e.addChild("author");
author.addAttrib("age", 43);
author.addText("Tolkien");

Это приведет к следующему XML:

<book title="Lord of the Rings">
  <author age="43">Tolkien</author>
</book>
2 голосов
/ 30 января 2009

Создание XML вручную - один из самых надежных способов безумия, которые я знаю. В конце концов, кто-то где-то испортит сущность, или пропадет завершающая скобка, или что-то ... просто используйте библиотеку. GenX будет моим выбором.

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

2 голосов
/ 29 января 2009

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

1 голос
/ 30 января 2009

У меня была такая же проблема с желанием передавать сообщения XML между встроенными устройствами.

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

http://www.scottlangham.co.uk/2009/01/rapidxml-a-quick-xml-parsergenerator-for-c/

Пример использования показан в комментариях.

Чтобы написать xml, вы можете сделать что-то вроде следующего:

int isbn = 2938237;
wstring authorName = "Isaac Asimov";
wstring borrower = "Mr. Blobby";

CWTag bookTag = libraryTag(L"Book")
    (L"author",authorName) (L"isbn",isbn) (L"borrower",borrower);
bookTag(L"Review") (L"comments", L"very good");

и это приводит к добавлению нового xml под тегом:

<Book author="Isaac Asimov" isbn="2938237" borrower="Mr. Blobby">
    <Review comments="very good"/>
</Book>

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

1 голос
/ 29 января 2009

Метрика

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

Если члены вашей команды похожи на меня, они быстро изменят свою мелодию.

плюс, учитывайте время QA, если они неправильно его кодируют, и т. Д ...

используйте библиотеку столько, сколько сможете.

0 голосов
/ 30 января 2009

Я на самом деле использую CMarkup из FirstObject.com .

CodeProject имеет более старый дистрибутив и текстовое руководство (http://www.codeproject.com/KB/cpp/markupclass.aspx)

Доступны дистрибутивы исходного кода, и компонент поставляется в нескольких вариантах (Developer, Advanced Developer) через страницы загрузки FirstObject.

Веб-сайт FirstObject содержит много полезных примеров, и они даже распространяют бесплатный редактор XML.

Нет, я не сотрудник, но я довольный владелец компонента.

0 голосов
/ 30 января 2009

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

astream << "<book title=\"Lord of the Rings\"><author age=\"43\">Tolkien</author></book>"

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

Как и оптимизация, вы никогда не должны ничего менять, не оценивая, какой эффект это даст. Здесь, если ваш код поддерживается как есть, следуйте ему. Попытайтесь изменить его только тогда, когда вы измерили его ремонтопригодность (то есть заметили, что обновлять XML-файлы неудобно) и обнаружили, что это занимает слишком много времени для удобства.

0 голосов
/ 29 января 2009

Я бы просто использовал дерево DOM. Таким образом, вам не нужно анализировать данные взад и вперед при отправке и получении строк XML.

--- Немного не по теме: Для других людей, которые просто заходят в этот пост и случайно нуждаются в сверхлегком фреймворке DOM xml, используйте его: http://www.applied -mathematics.net / tools / xmlParser.html

Он очень прост в использовании и состоит из 2 файлов.

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