Sollte ich XPath oder nur DOM verwenden?

8

Ich habe eine Reihe von hierarchischen Daten in einer XML-Datei gespeichert. Ich verpacke das mit TinyXML hinter handgemachten Klassen. Gegeben ein XML-Fragment, das eine Quellsignatur als eine Menge von (Häufigkeits-, Level-) Paaren beschreibt, etwa so:

%Vor%

Ich extrahiere die Paare mit diesem:

%Vor%

wobei node () auf den Knoten <source> zeigt.

Frage: Würde ich stattdessen ein besseres, eleganteres, besser zu wartendes oder besseres Codeprogramm mit einer XPath-Bibliothek erhalten?

Update: Ich habe es versucht, mit TinyXPath zwei Möglichkeiten. Keiner von beiden arbeitet wirklich, was offensichtlich ein großer Punkt gegen sie ist. Mache ich etwas grundsätzlich falsch? Wenn das mit XPath so aussieht, glaube ich nicht, dass es mir etwas bringt.

%Vor%

Wenn ja, welche XPath-Bibliothek sollte ich als Zweites verwenden?

    
Pete 04.03.2011, 13:53
quelle

4 Antworten

5

Im Allgemeinen bevorzuge ich XPath-basierte Lösungen wegen ihrer Kürze und Vielseitigkeit, aber ehrlich gesagt, in Ihrem Fall glaube ich nicht, dass die Verwendung von XPath viel zu Ihrem signature bringt.

Hier ist warum:

Code Eleganz
Ihr Code ist schön und kompakt und es wird nicht besser mit einem XPath-Ausdruck.

Speicherbedarf
Wenn Ihre Eingabe-XML-Konfigurationsdatei nicht riesig ist (eine Art Oxymoron) und das DOM-Parsing einen großen Speicherbedarf hat, für den es keinen Beweis gibt, dass die Verwendung von XPath ein entscheidendes Heilmittel wäre, würde ich bei DOM bleiben.

Ausführungsgeschwindigkeit
In einem solchen einfachen XML-Baum sollte die Ausführungsgeschwindigkeit vergleichbar sein. Wenn es einen Unterschied geben würde, wäre es wahrscheinlich in TinyXmls Vorteil, weil die Tags freq und level unter einem bestimmten Knoten kollokieren.

Bibliotheken und externe Referenzen Das ist der entscheidende Punkt.
Die führende XPath-Engine in der C ++ - Welt ist XQilla . Es unterstützt XQuery (daher sowohl XPath 1.0 als auch 2.0) und wird von Oracle unterstützt, da es von der für Berkeley DB-Produkte verantwortlichen Gruppe entwickelt wurde (einschließlich Berkeley DB XML - , die XQilla verwendet).
Das Problem für C ++ - Entwickler, die XQilla verwenden möchten, ist, dass sie mehrere Alternativen haben.

  1. Verwenden Sie Xerces 2 und XQilla 2.1, um Ihren Code mit Umwandlungen zu versehen.
  2. Verwenden Sie XQilla 2.2+ und verwenden Sie Xerces 3 (hier sind keine Umwandlungen erforderlich)
  3. Verwenden Sie TinyXPath , das mit TinyXml aber gut integriert ist für die es jedoch eine Reihe von Einschränkungen gibt (z. B. keine Unterstützung für Namespaces)
  4. mixe Xerces und tinyXml

Zusammenfassend würde die Umstellung auf XPath nur für Sie von Vorteil sein.

XPath ist jedoch ein sehr mächtiges Werkzeug in der Entwickler-Toolbox von heute und niemand kann es ignorieren. Wenn Sie nur an einem einfachen Beispiel üben möchten, ist Ihr so ​​gut wie jeder andere. Dann denke ich an die obigen Punkte und verwende wahrscheinlich TinyXPath .

    
Alain Pannetier 05.03.2011, 07:34
quelle
3

Sie benötigen XPath, wenn Sie die Laufzeitänderungen der extrahierten Werte flexibel vornehmen können.

Wenn Sie diese Flexibilität jedoch nicht benötigen oder eine Neukompilierung zum Extrahieren der extrahierten Objekte kein Problem darstellt, werden die Dinge nicht oft geändert oder die Benutzer müssen die Ausdrücke nie aktualisieren. Oder wenn das, was Sie haben, gut für Sie funktioniert, brauchen Sie XPath nicht und es gibt viele Anwendungen, die es nicht verwenden.

Ob es lesbarer ist, na ja, sicher kann es sein. Aber wenn Sie nur ein paar Werte herausziehen, würde ich die Notwendigkeit in Frage stellen, eine andere Bibliothek zu ziehen.

Ich würde sicherlich dokumentieren, was Sie derzeit ein bisschen besser als diejenigen, die nicht mit tinyxml oder XML-Bibliotheken vertraut sind möglicherweise nicht sicher, was es tut, aber es ist nicht schwer zu verstehen, wie es ist.

Ich bin mir nicht sicher, welche Art von Overhead-XPath hinzugefügt wird, aber ich vermute, dass einige hinzugefügt werden. Für die meisten, denke ich, werden sie überhaupt keinen Unterschied bemerken, und es mag euch oder den meisten Leuten nicht wichtig sein, aber seid euch dessen bewusst, falls es etwas ist, worüber Sie besorgt sind.

Wenn Sie eine xpath-Bibliothek verwenden wollen, kann ich nur sagen, dass ich diejenige verwendet habe, die mit Xerces-C ++ geliefert wurde, und es war nicht schwer zu lernen. Ich habe TinyXML bereits verwendet und jemand hat hier TinyXPath erwähnt. Ich habe keine Erfahrung damit, aber es ist verfügbar.

Ich fand diesen Link auch nützlich, wenn ich zuerst über XPath-Ausdrücke lerne. Ссылка

    
Matt 05.03.2011 07:55
quelle
1

XPath wurde dafür gemacht, also wird Ihr Code natürlich "besser" sein, wenn Sie ihn verwenden.

Ich kann keine spezielle C ++ - XPath-Bibliothek empfehlen, aber obwohl die Verwendung der einen die meiste Zeit die richtige Entscheidung ist, sollten Sie eine Kosten / Nutzen-Analyse durchführen, bevor Sie eine hinzufügen. Vielleicht YAGNI .

    
Jon 04.03.2011 14:31
quelle
1

Dieser XPath-Ausdruck :

%Vor%

wählt alle untergeordneten Elemente (nur das Paar freq und level ) des $ pN-ten sig untergeordneten Elements des obersten Elements des XML-Dokuments aus.

Die Zeichenfolge $pN sollte durch eine bestimmte positive Ganzzahl ersetzt werden, zum Beispiel:

%Vor%

wählt diese beiden Elemente aus :

%Vor%

Verwendung eines XPath-Ausdrucks, da dieser offensichtlich viel kürzer und verständlicher ist als der bereitgestellte C ++ - Code.

Ein weiterer Vorteil besteht darin, dass derselbe XPath-Ausdruck aus einem C # - oder Java oder ... -Programm verwendet werden kann, ohne dass er in irgendeiner Weise geändert werden muss Grad der Portabilität.

    
Dimitre Novatchev 04.03.2011 18:42
quelle

Tags und Links