Ein leichtgewichtiger XML-Parser für große Dateien?

8

Ich muss möglicherweise riesige XML-Dateien parsen, also schätze ich, dass dies DOM-Parser ausschließt.

Gibt es einen guten, leichtgewichtigen SAX-Parser für C ++, vergleichbar mit TinyXML auf Footprint? Die Struktur von XML ist sehr einfach, es werden keine fortgeschrittenen Dinge wie Namespaces und DTDs benötigt. Nur Elemente, Attribute und cdata.

Ich kenne Xerces, aber seine schiere Größe von über 50mb gibt mir Gänsehaut.

Danke!

    
Alex Jenter 17.06.2009, 11:53
quelle

9 Antworten

7

Wenn Sie C verwenden, können Sie LibXML von Gnome Projekt. Sie haben die Wahl zwischen DOM- und SAX-Schnittstellen zu Ihrem Dokument sowie vielen zusätzlichen Funktionen, die über Jahre hinweg entwickelt wurden. Wenn Sie wirklich C ++ wollen, können Sie libxml ++ verwenden, was ein C ++ - OO-Wrapper um LibXML ist.

Die Bibliothek hat sich immer wieder bewährt, ist leistungsstark und kann auf fast jeder Plattform kompiliert werden, die Sie finden können.

    
Tony Miller 17.06.2009, 11:59
quelle
6

Ich mag ExPat
Ссылка

Es basiert auf C, aber es gibt mehrere C ++ - Wrapper, die helfen sollen.

    
Martin York 17.06.2009 17:01
quelle
4

RapidXML ist ein ziemlich schneller Parser für XML in C ++ geschrieben.

    
dtw 23.01.2010 21:44
quelle
2

Ссылка dies ist ein direkter C ++ - Port des Java-XML-Pull-API ( Ссылка )

Ich würde diesen Parser sehr empfehlen. Ich musste es für die Verwendung auf meinem Embedded-Gerät (keine STL-Unterstützung) anpassen, aber ich habe festgestellt, dass es sehr schnell mit sehr wenig Overhead ist. Ich musste meine eigenen String- und Vektorklassen erstellen, und sogar mit diesen kompiliert es unter Windows zu etwa 60.000.

Ich denke, das Pull-Parsing ist viel intuitiver als etwas wie SAX. Der Code spiegelt das xml-Dokument viel besser wider, so dass es leicht ist, die beiden zu korrelieren.

Der einzige Nachteil ist, dass es nur vorwärts ist, was bedeutet, dass Sie die Elemente analysieren müssen, so wie sie kommen. Wir haben ein ziemlich durcheinandergebranntes Design zum Lesen unserer Konfigurationsdateien, und ich muss einen ganzen Teilbaum analysieren, einige Überprüfungen vornehmen, dann einige Standardwerte setzen und dann erneut parsen. Mit diesem Parser ist der einzige wirkliche Weg, so etwas zu handhaben, eine Kopie des Zustands zu erstellen, damit zu analysieren und dann mit dem Original fortzufahren. Es ist immer noch ein großer Gewinn in Bezug auf Ressourcen gegenüber unserem alten DOM-Parser.

    
Dolphin 17.06.2009 18:37
quelle
1

Wenn Ihre XML-Struktur sehr einfach ist, können Sie einen einfachen Lexer / Scanner erstellen, der auf lex / yacc (flex / bison) basiert. Die Quellen im W3C könnten Sie inspirieren: Ссылка und Ссылка .

Siehe auch die SAX2-Schnittstelle in libxml

    
Pierre 17.06.2009 12:01
quelle
1

firstobjects CMarkup ist eine C ++ - Klasse, die als leichter riesiger Datei-Pull-Parser funktioniert (ich empfehle einen Pull-Parser anstelle von SAX), und auch ein riesiger XML-Dateischreiber. Es fügt ungefähr 250kb zu Ihrer ausführbaren Datei hinzu. Wenn es im Speicher verwendet wird, hat es 1/3 der Größe von tinyxml von einem Benutzerbericht. Wenn es in einer großen Datei verwendet wird, enthält es nur einen kleinen Puffer (wie 16 KB) im Speicher. CMarkup ist derzeit ein kommerzielles Produkt, daher wird es unterstützt, dokumentiert und entwickelt, um es einfach mit einer einzigen cpp- und h-Datei zu Ihrem Projekt hinzuzufügen.

Der einfachste Weg, es auszuprobieren, ist mit einem Skript im kostenlosen firstobject XML-Editor wie folgt:

%Vor%

Wählen Sie im Menü Datei die Option Neues Programm, fügen Sie dieses ein und ändern Sie es für Ihre Elemente und Attribute, drücken Sie F9, um es auszuführen, oder F10, um es zeilenweise zu durchlaufen.

    
Ben Bryant 28.09.2009 17:03
quelle
1

Sie können versuchen Ссылка . es scheint sehr klein und einfach zu bedienen zu sein

Dies ist eine kürzlich erstellte C ++ 0x XML SAX Parser Open Source und der Autor ist bereit Rückmeldungen

analysiert einen Eingabestream und generiert Ereignisse auf Callbacks, die mit std :: function

kompatibel sind

Die Stapelmaschine verwendet endliche Automaten als Backend und einige Ereignisse (Start-Tag und Text-Knoten) verwenden Iteratoren, um die Pufferung zu minimieren, was sie ziemlich leicht macht.

    
thinlizzy 23.11.2011 14:40
quelle
0

Ich würde mir Tools ansehen, die einen DTD / Schema-spezifischen Parser generieren , wenn Sie klein und schnell sein wollen. Diese sind sehr gut für große Dokumente.

    
Ira Baxter 04.09.2009 03:46
quelle
-1

Ich empfehle pugixml

pugixml ist eine leichtgewichtige C ++ XML-Verarbeitungsbibliothek.

"pugixml ist eine C ++ - XML-Verarbeitungsbibliothek, die aus einer DOM-ähnlichen Schnittstelle mit umfangreichen Traversierungs- / Modifikationsfunktionen, einem extrem schnellen XML-Parser zur Erstellung der DOM-Struktur aus einer XML-Datei / einem XML-Puffer und einem XPath besteht 1.0-Implementierung für komplexe datengesteuerte Baum-Abfragen.Full Unicode-Unterstützung ist ebenfalls verfügbar, mit Unicode-Schnittstellen-Varianten und Konvertierungen zwischen verschiedenen Unicode-Kodierungen.

Ich habe ein paar XML-Parser getestet, darunter ein paar teure, bevor ich pugixml in einem kommerziellen Produkt auswähle und benutze.

pugixml war nicht nur der schnellste Parser, sondern hatte auch die ausgereifteste und freundlichste API. Ich empfehle es sehr. Es ist sehr stabiles Produkt! Ich habe angefangen, es seit Version 0.8 zu benutzen. Jetzt ist es 1.7.

Der große Bonus in diesem Parser ist die XPath 1.0-Implementierung! Für komplexere Baumabfragen ist der XPath ein God Send-Feature!

Eine DOM-ähnliche Schnittstelle mit umfangreichen Traversierungs- / Modifikationsfunktionen ist äußerst nützlich, um echte "schwere" XML-Dateien zu bearbeiten.

Es ist ein kleiner, schneller Parser. Es ist eine gute Wahl, auch für iOS oder Android-App, wenn Sie nichts dagegen haben, C ++ - Code zu verknüpfen.

Benchmarks können viel erzählen. Siehe: Ссылка

Einige Beispiele für (x86):

%Vor%

Für (x64) pugixml ist der schnellste Parser, den ich kenne.

Überprüfen Sie auch die Verwendung des Speichers durch Ihren XML-Parser. Einige Parser verschlingen wertvolle Erinnerungen!

    
sg7 09.06.2016 00:46
quelle

Tags und Links

yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '334525',
    'url' => 'a-lightweight-xml-parser-efficient-for-large-files',
];

$_COOKIE = [
    'advanced-frontend' => '814962ea9652807bee2d3472a852080c',
    '_csrf-frontend' => '63dbe88414b96b914ddecf8e62aabb6e0076fa18cffe350ac576c8c31bf57df8a:2:{i:0;s:14:"_csrf-frontend";i:1;s:32:"m-H9BOteNXoof9TXwTz1JcX2N6XIbVJv";}',
];

$_SESSION = [
    '__flash' => [],
];