webentwicklung-frage-antwort-db.com.de

Was ist der beste Open XML-Parser für C ++?

Ich suche einen einfachen, sauberen und korrekten XML-Parser für mein C++ - Projekt. Soll ich meine eigene schreiben?

240
whaledawg

Wie wäre es mit RapidXML ? RapidXML ist ein sehr schneller und kleiner XML-DOM-Parser, der in C++ geschrieben wurde. Es richtet sich in erster Linie an Embedded-Umgebungen, Computerspiele oder andere Anwendungen, in denen der verfügbare Arbeitsspeicher oder die CPU-Verarbeitungsleistung eine wichtige Rolle spielen. RapidXML ist unter der Boost Software License lizenziert und der Quellcode ist frei verfügbar.

Funktionen

  • Parsing-Geschwindigkeit (einschließlich DOM-Tree-Building) nähert sich der Geschwindigkeit der Strlen-Funktion, die für dieselben Daten ausgeführt wird.
  • Auf einer modernen CPU (Stand 2008) beträgt der Parserdurchsatz etwa 1 Milliarde Zeichen pro Sekunde. Siehe Abschnitt Leistung im Online-Handbuch.
  • Geringer Speicherbedarf für den Code und die erstellten DOM-Bäume.
  • Eine reine Header-Implementierung, die den Integrationsprozess vereinfacht.
  • Einfache Lizenz, die die unverbindliche Verwendung für nahezu jeden kommerziellen und nichtkommerziellen Zweck ermöglicht.
  • Unterstützt UTF-8 und teilweise UTF-16, UTF-32-Codierungen.
  • Portabler Quellcode ohne andere Abhängigkeiten als eine sehr kleine Teilmenge der C++ Standard Library.
  • Diese Untermenge ist so klein, dass sie leicht manuell emuliert werden kann, wenn die Verwendung einer Standardbibliothek nicht erwünscht ist.

Einschränkungen

  • Der Parser ignoriert DOCTYPE-Deklarationen.
  • XML-Namespaces werden nicht unterstützt.
  • Der Parser überprüft nicht die Gültigkeit der Zeichen.
  • Die Schnittstelle des Parsers entspricht nicht der DOM-Spezifikation.
  • Der Parser überprüft nicht die Eindeutigkeit von Attributen.

Quelle: wikipedia.org://Rapidxml


Abhängig von Ihrer Verwendung können Sie eine XML-Datenbindung verwenden. CodeSynthesis XSD ist ein XML-Datenbindungscompiler für C++, der von Code Synthesis entwickelt und unter der doppelten Lizenz der GNU GPL und eine proprietäre Lizenz. Bei einer gegebenen XML-Instanzspezifikation (XML-Schema) werden C++ - Klassen generiert, die das angegebene Vokabular sowie den Parsing- und Serialisierungscode darstellen.

Eine der einzigartigen Eigenschaften von CodeSynthesis XSD ist die Unterstützung von zwei verschiedenen Zuordnungen von XML-Schema zu C++: speicherinternes C++/Tree und streamorientiertes C++/Parser. Das C++/Tree-Mapping ist ein traditionelles Mapping mit einer baumartigen In-Memory-Datenstruktur. C++/Parser ist ein neues, SAX-ähnliches Mapping, das die in XML-Instanzdokumenten gespeicherten Informationen als Hierarchie vokabularspezifischer Analyseereignisse darstellt. Im Vergleich zu C++/Tree können mit der C++/Parser-Zuordnung große XML-Dokumente verarbeitet werden, die nicht in den Arbeitsspeicher passen, eine streamorientierte Verarbeitung ausführen oder eine vorhandene speicherinterne Darstellung verwenden.

Quelle: wikipedia.org://CodeSynthesis XSD

118
jk.

pugixml - Leichter, einfacher und schneller XML-Parser für C++ Sehr klein (vergleichbar mit RapidXML), sehr schnell (vergleichbar mit RapidXML), sehr einfach zu bedienen ( besser als RapidXML).

98
Zbyl

Probieren Sie TinyXML aus.

http://sourceforge.net/projects/tinyxml

41
Rob

TiCPP ist eine "more c ++" Version von TinyXML.

'TiCPP' ist die Abkürzung für den offiziellen Namen TinyXML ++. Es ist eine völlig neue Schnittstelle zu TinyXML ( http://www.grinninglizard.com/tinyxml/ ), die VIELE der C++ - Stärken nutzt. Vorlagen, Ausnahmen und viel bessere Fehlerbehandlung. Es ist auch vollständig in Sauerstoff dokumentiert. Es ist wirklich cool, denn mit dieser Version können Sie winzige Benutzeroberflächen genauso wie zuvor erstellen oder die neuen 'Ticpp'-Klassen verwenden. Sie müssen lediglich TIXML_USE_TICPP definieren. Es wurde getestet in VC 6.0, VC 7.0, VC 7.1, VC = 8.0, MinGW gcc 3.4.5 und unter Linux GNU gcc 3+

16
Kasprzol

versuchen Sie Folgendes: http://www.applied-mathematics.net/tools/xmlParser.html
Es ist einfacher und schneller als RapidXML oder PUGXML.
TinyXML ist der schlechteste "einfache Parser".

14
Kat

Verwenden Sie TinyXML nicht, wenn Sie sich Gedanken über die Effizienz/Speicherverwaltung machen (es weist häufig viele winzige Blöcke zu). Mein persönlicher Favorit ist RapidXML .

12
yrp

Wie wäre es mit gSOAP ? Es ist Open Source und unter der GPL-Lizenz frei verfügbar. Trotz seines Namens ist das gSOAP-Toolkit ein generisches XML-Datenbindungstool, mit dem Sie Ihre C- und C++ - Daten automatisch an XML binden können. Es ist nicht erforderlich, eine XML-Parser-API zu verwenden. Lassen Sie Ihre Daten einfach im XML-Format lesen/schreiben. Wenn Sie wirklich einen supereinfachen C++ - XML-Parser benötigen, ist gSOAP möglicherweise ein Overkill. Aber für alles andere hat es gut funktioniert, wie Testimonials für viele industrielle Anwendungen zeigen, seit gSOAP im Jahr 2001 eingeführt wurde.

Hier ist eine kurze Liste der Funktionen:

  • Portabel: Windows, Linux, Mac OS X, Unix, VxWorks, Symbian, Palm OS, WinCE usw.
  • Geringer Platzbedarf: 73 KB Code und weniger als 2 KB Daten zur Implementierung einer XML-Webdienst-Client-App (kein DOM zur Begrenzung der Speichernutzung).
  • Schnell: Glauben Sie nicht, was andere Tools behaupten, die wahre Geschwindigkeit sollte gemessen werden mit I/O. Für gSOAP sind es über 3000 Roundtrip-XML-Nachrichten über TCP/IP. Der XML-Parsing-Aufwand ist vernachlässigbar, da es sich um einen einfachen linearen Scan der Eingabe/Ausgabe handelt, während eine (De-) Serialisierung stattfindet.
  • XML-Unterstützung: XML-Schema (XSD) -Import/-Export, WSDL-Import/-Export, XML-Namespaces, XML-Kanonisierung, XML mit Anhängen (MIME), optionale Verwendung von DOM, viele Optionen zum Erzeugen von XML mit Einzug, Verwendung von UTF8-Zeichenfolgen usw.
  • XML-Validierung: teilweise und vollständig (Option)
  • WS-Unterstützung: WS-Sicherheit, WS-ReliableMessaging, WS-Adressierung, WS-Richtlinie, WS-Sicherheitspolitik und andere.
  • Debugging: Integriertes Speichermanagement mit Leckerkennung, Protokollierung.
  • API: Es muss keine API erlernt werden, nur die Kontextinitialisierung der "Soap" -Maschine und die Verwendung der Lese-/Schreibschnittstelle für Ihre Daten sowie die Zerstörung des Kontextes der "Soap" -Maschine.

Zum Beispiel:

class Address
{ 
  std::string name;
  std::vector<LONG64> number;
  time_t date;
};

Führen Sie dann "soapcpp2" für die obige Klassendeklaration Address aus, um den XML-Reader und -Schreiber soap_read_Address Und soap_write_Address Zu generieren. Beispiel:

Address *a = new Address();
a = ...;
soap ctx = soap_new();
soap_write_Address(ctx, a);
soap_end(ctx);
soap_free(ctx);`

Dies erzeugt eine XML-Darstellung des Objekts Address a. Durch Kommentieren der Header-Dateideklarationen mit XML-Namespace-Details (hier nicht gezeigt) generieren die Tools auch Schemas. Dies ist ein einfaches Beispiel. Die gSOAP-Tools können eine Vielzahl von C- und C++ - Datentypen verarbeiten, einschließlich zeigerbasierter verknüpfter Strukturen und sogar (zyklischer) Diagramme (anstatt nur Bäume).

Hoffe das hilft.

10
Bob

Ich bin ein C++ Neuling und nachdem ich ein paar verschiedene Vorschläge auf dieser Seite ausprobiert habe, muss ich sagen, dass ich pugixml am meisten mag. Es hat eine leicht verständliche Dokumentation und eine High-Level-API, nach der ich nur gesucht habe.

9
godspeedelbow

TinyXML eignet sich am besten für die einfache XML-Arbeit. Wenn Sie jedoch mehr Funktionen benötigen, probieren Sie Xerces aus dem Apache-Projekt aus. Auf der folgenden Seite erfahren Sie mehr über die Funktionen.

http://xerces.Apache.org/xerces-c/

9
Raminder

TinyXML und auch Boost.PropertyTree. Letzteres erfüllt nicht alle behördlichen Anforderungen, ist aber sehr einfach.

8
Lev

Ich mag den Gnome XML-Parser. Es ist Open Source (MIT-Lizenz, damit Sie es in kommerziellen Produkten verwenden können), schnell und verfügt über DOM- und SAX-basierte Schnittstellen.

http://xmlsoft.org/

7
dicroce

Versuchen Sie TinyXML oder IrrXML ... Beide sind einfache XML-Parser (ich würde vorschlagen, dass Sie trotzdem TinyXML verwenden).

2
Prog