18 Stimmen

Wie kann ich am einfachsten Xml in C++ generieren?

Ich habe Boost-Serialisierung verwendet, aber dies scheint nicht zu ermöglichen, mich zu generieren xml, die ein bestimmtes Schema entspricht - es scheint, es Zweck war nur zu persistieren einer Klasse Zustand.

Plattform: linux

Was benutzt ihr, um Xml zu generieren und NICHT zu parsen?

Bislang gehe ich den Weg von Foredecker, es einfach selbst zu generieren - es ist kein großes Dokument, aber ich sollte wirklich nicht so viele Schwierigkeiten haben, eine anständige Bibliothek zu finden, um es korrekt zu generieren.

Was die Verstärkung betrifft, so möchte ich die Knotennamen festlegen, Attribute in meinen Knoten setzen und den ganzen zusätzlichen Mist loswerden, der damit verbunden ist, da ich mich nicht wirklich darum kümmere, dass ich mein Dokument wieder in diese Klasse einfügen muss.

0 Stimmen

Ich habe verwendet libxml++ um XML zu generieren, aber ich kann nicht garantieren, dass es der einfachste Weg ist! :-)

52voto

MattyT Punkte 6206

Ich habe kürzlich eine Reihe von XML-Bibliotheken speziell für die Generierung von XML-Code geprüft.

Zusammenfassung: Ich habe mich für Folgendes entschieden TinyXML++ .

TinyXML++ hat eine anständige C++-Syntax, basiert auf dem ausgereiften TinyXML C-Bibliotheken, ist frei und quelloffen (MIT-Lizenz) und klein. Kurz gesagt, es hilft, die Arbeit schnell zu erledigen. Hier ist ein kurzer Ausschnitt:

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

Das ergibt:

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

Ich bin sehr zufrieden damit.

Ich habe viele andere getestet; hier sind einige der besseren Kandidaten:

Xerces : Der King-Daddy. Macht alles (insbesondere in Kombination mit Xalan ), ist aber schwerfällig und zwingt dem Benutzer die Speicherverwaltung auf.

RapidXML : Hervorragend zum Parsen geeignet (es ist ein In-situ-Parser und ist schnell ), aber nicht gut für die Generierung, da das Hinzufügen von Knoten zum DOM Speicherverwaltung erfordert.

Boost.XML (Vorschlag): Sieht aus wie großartig - leistungsfähige, ausgezeichnete C++-Syntax. Allerdings hat es den Review-Prozess noch nicht durchlaufen, wird nicht unterstützt und die Schnittstelle kann sich durchaus ändern. Ich habe es trotzdem fast benutzt. Ich freue mich auf seine Aufnahme in Boost.

Libxml ( ++ ): Sehr gut; leistungsstark, anständige Syntax. Aber es ist ziemlich groß, wenn Sie nur Erzeugung von XML und ist mit der glibmm-Bibliothek (für ustring) verbunden. Wenn wir nur auf Linux (wie Sie?) würde ich ernsthaft in Betracht ziehen.

XiMOL : Einzigartige Stream-basierte Bibliothek. Dies war ein wenig zu einfach für unsere Bedürfnisse, aber für grundlegende XML-Generierung können Sie es recht nützlich finden. Die Stream-Syntax ist recht ordentlich.

Hoffentlich ist etwas Nützliches dabei!

14voto

Foredecker Punkte 7337

Manche werden mich vielleicht für einen XML-Ketzer halten, aber eine effektive Methode ist es, sie einfach mit Ihren bevorzugten String-Ausgabewerkzeugen (Drucken, Ausgabestreams usw.) zu erzeugen - das kann in einen Puffer oder eine Datei gehen.

Nach dem Speichern sollten Sie die Daten wirklich mit einem Schema validieren, bevor Sie sie übertragen und versenden.

Für eines unserer Projekte haben wir einen sehr einfachen Satz von Vorlagen für die Verwaltung von Anfangs-/End-Tags und Attributen. Diese haben jeweils einen Stream-Operator. Das macht es sehr einfach, den XML-Quelltext zu generieren und zu debuggen. Dadurch sieht die Struktur des XML-Generierungscodes sehr ähnlich aus wie das XML selbst.

Ein Vorteil ist, dass Sie große Mengen an XML effizient generieren können, wenn Sie sie in eine Datei streamen. Die Kosten für die Validierung zahlen Sie später (vermutlich zu einem günstigeren Zeitpunkt für einen teuren Vorgang).

Der Nachteil dieser Technik ist, dass sie im Wesentlichen nur für die Ausgabe geeignet ist. Sie ist nicht geeignet, um XML dynamisch zu erstellen und zu konsumieren.

10voto

Daniel Wolf Punkte 11529

Boost.PropertyTree ist eine schöne und unkomplizierte Möglichkeit, XML zu erzeugen - vor allem, wenn Sie bereits Boost verwenden.

Im Folgenden finden Sie ein vollständiges Beispielprogramm:

#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;
}

Die resultierende XML-Datei sieht wie folgt aus:

<?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>

Besonders schön sind die durch Punkte getrennten Pfade, mit denen Sie implizit alle Knoten entlang des Weges erstellen können. Die Dokumentation ist eher mager, aber zusammen mit ptree.hpp sollte Ihnen eine Vorstellung davon vermitteln, wie es funktioniert.

0voto

Serge Wautier Punkte 20814

Welche Plattform? MSXML ist eine Option für Windows. CMarkup ist eine weitere gute Wahl. Wenn .NET eine Option ist, bietet es hervorragende XML-Unterstützung.

0voto

coppro Punkte 14158

Ich habe nicht wirklich versucht, Boost-Serialisierung, dies zu tun, aber wie ich es verstehe, wenn Sie sehr sorgfältig wählen Sie Ihre Optionen, können Sie viele verschiedene Optionen im Schema (z. B. verhindern Zeiger Fliegengewichtung und Einstellung der Elementnamen für bestimmte Typen) festgelegt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X