Какой самый простой способ генерировать XML в C ++? - PullRequest
15 голосов
/ 20 ноября 2008

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

Платформа: Linux

Что вы, ребята, используете для генерации НЕ синтаксического анализа xml?

Пока что я иду по пути Foredecker'а, чтобы просто сгенерировать его самостоятельно - это не большой документ, но у меня действительно не должно быть особых проблем с поиском достойной библиотеки для правильной генерации.

Что касается наддува, то, что я хотел бы сделать, это установить имена узлов, установить атрибуты в моих узлах и избавиться от всего лишнего дерьма, которое идет с ним, так как мне на самом деле все равно необходимость вернуть мой документ в этот класс.

Ответы [ 6 ]

48 голосов
/ 20 ноября 2008

Недавно я рассмотрел несколько библиотек XML специально для генерации кода XML.

Резюме: я выбрал TinyXML ++ .

TinyXML ++ имеет приличный синтаксис C ++, построен на зрелых TinyXML C библиотеках, является бесплатным и открытым исходным кодом (лицензия MIT) и небольшим. Короче говоря, это помогает выполнить работу быстро. Вот быстрый фрагмент:

Document doc;
Node* root(doc.InsertEndChild(Element("RootNode")));
Element measurements("measurements");
Element tbr("TotalBytesReceived",  12);
measurements.InsertEndChild(tbr);
root->InsertEndChild(measurements);

Который производит:

<RootNode>
    <measurements>
        <TotalBytesReceived>12</TotalBytesReceived>
    </measurements>
</RootNode>

Я был вполне доволен этим.

Я рассмотрел многие другие; Вот некоторые из лучших претендентов:

Xerces : Король-папочка. все (особенно в сочетании с Xalan ), но тяжелый и навязывает пользователю управление памятью.

RapidXML : отлично подходит для синтаксического анализа (это синтаксический анализатор на месте и быстрый ), но не годится для генерации, поскольку для добавления узлов в DOM требуется управление памятью.

Boost.XML (предложение): выглядит отлично - мощный, отличный синтаксис C ++. Однако он еще не прошел процесс проверки, не поддерживается, и интерфейс вполне может измениться. Почти все равно использовал это. С нетерпением жду его принятия в Boost.

Libxml ( ++ ): очень хорошо; мощный, достойный синтаксис. Но это большая проблема, если все, что вы делаете, это генерирует XML и привязаны к библиотеке glibmm (для ustring). Если бы мы были только в Linux (как и вы?), Я бы серьезно подумал.

XiMOL : Уникальная потоковая библиотека. Это было слишком упрощенно для наших нужд, но для базового генерирования XML вы можете найти его весьма полезным. Синтаксис потока довольно аккуратный.

Надеюсь, что-то там пригодится!

13 голосов
/ 20 ноября 2008

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

После сохранения - вам действительно нужно проверить схему с помощью схемы перед отправкой.

Для одного из наших проектов у нас есть очень простой набор шаблонов для управления начальными / конечными тегами и атрибутами. У каждого из них есть оператор вывода потока. Это упрощает генерацию исходного XML и отладку. Это делает структуру кода генерации XML очень похожей на сам XML.

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

Недостатком этого метода является то, что он по сути только выходной. Он не подходит для динамического создания и использования XML.

9 голосов
/ 16 июня 2012

Boost.PropertyTree - это приятный и простой способ генерации XML - особенно если вы уже используете Boost.

Ниже приведен полный пример программы:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

using boost::property_tree::ptree;
using boost::property_tree::write_xml;
using boost::property_tree::xml_writer_settings;

int wmain(int argc, wchar_t* argv[]) {
    char* titles[] = {"And Then There Were None", "Android Games", "The Lord of the Rings"};

    ptree tree;
    tree.add("library.<xmlattr>.version", "1.0");
    for (int i = 0; i < 3; i++) {
        ptree& book = tree.add("library.books.book", "");
        book.add("title", titles[i]);
        book.add("<xmlattr>.id", i);
        book.add("pageCount", (i+1) * 234);
    }

    // Note that starting with Boost 1.56, the template argument must be std::string
    // instead of char
    write_xml("C:\\Users\\Daniel\\Desktop\\test.xml", tree,
        std::locale(),
        xml_writer_settings<char>(' ', 4));

    return 0;
}

Полученный XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<library version="1.0">
    <books>
        <book id="0">
            <title>And Then There Were None</title>
            <pageCount>234</pageCount>
        </book>
        <book id="1">
            <title>Android Games</title>
            <pageCount>468</pageCount>
        </book>
        <book id="2">
            <title>The Lord of the Rings</title>
            <pageCount>702</pageCount>
        </book>
    </books>
</library>

Одна вещь, которая особенно хороша, - это разделенные точками пути, которые позволяют вам неявно создавать все узлы на этом пути. Документация довольно скудна, но вместе с ptree.hpp должна дать вам представление о том, как она работает.

0 голосов
/ 20 ноября 2008

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

0 голосов
/ 20 ноября 2008

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

0 голосов
/ 20 ноября 2008

Какая платформа? MSXML - это опция для Windows. CMarkup - еще один хороший выбор. Если вариант .NET, он имеет отличную поддержку XML.

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