какой самый простой способ сгенерировать xml в С++?

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

Платформа: линукс

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

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

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


person eyberg    schedule 19.11.2008    source источник
comment
Я использовал libxml++ для создания XML, но я не могу гарантировать, что это самый простой способ! :-)   -  person activout.se    schedule 20.11.2008


Ответы (6)


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

После сохранения - вам действительно следует проверить схему, прежде чем отправлять ее.

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

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

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

person Foredecker    schedule 19.11.2008
comment
большое спасибо! Я провел последние 2-3 часа, просматривая Интернет, группы новостей, irc и т. д., и за последние 20 минут я построил генератор, который делает именно то, что мне нужно, используя этот метод — это некрасиво; нужна работа, но это РАБОТАЕТ - спасибо! - person eyberg; 20.11.2008
comment
Ага, еретик! ;) А если серьезно, я бы не советовал идти по этому пути - существует множество библиотек, которые помогут и предотвратят ошибки в вашем XML. - person MattyT; 20.11.2008
comment
Что ж, я годами без проблем генерировал свой собственный XML. Как и Форедекер, наш XML относительно прост, но, возможно, сложнее, чем он утверждает. - person Rob; 19.10.2010
comment
Я инстинктивно согласен с этим ответом, за исключением того, что вам скорее всего придется избегать некоторых вещей. и может быть достаточно для большинства применений, но если ваши данные достаточно разнообразны, вам все равно придется писать половину общего генератора вывода XML... - person Edmund; 19.10.2010

Недавно я рассмотрел несколько 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 (для usstring). Если бы мы были только на Linux (как вы?), я бы серьезно задумался.

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

Надеюсь, там есть что-то полезное!

person MattyT    schedule 19.11.2008
comment
Глядя на страницу с проблемами TinyXML++, кажется, что у нее есть некоторые утечки памяти. Вы испытали это? - person metal; 28.03.2011
comment
@mlimber Я использую его довольно регулярно и не использовал, но я использую его только для относительно небольших документов. - person Jim Jeffries; 19.08.2011
comment
Хм, глядя на самый внутренний элемент, я сомневаюсь, что вывод и код совпадают. :-) - person Christoph Wurm; 25.05.2012
comment
Небольшая подсказка: поработав с TinyXML, я открыл для себя pugiXML. Память для меня имеет решающее значение, я разбираю огромные XML-деревья. Сделал быстрое сравнение с файлом XML размером 800 МБ. Для анализа TinyXML требовалось 9,5 ГБ (!) оперативной памяти, а для pugiXML — около 3,5 ГБ. - person Szak1; 17.09.2018

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 должен дать вам представление о том, как это работает.

person Daniel Wolf    schedule 15.06.2012

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

person Serge Wautier    schedule 19.11.2008
comment
CMarkup также работает без .Net. Вы можете создать его для использования std::string или MFC CString. Он создает весь документ в памяти, если это проблема. - person Martin Beckett; 10.09.2009

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

person coppro    schedule 19.11.2008

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

person Lodle    schedule 20.11.2008