2009-03-27 20 views
20

Ich muss eine XML-Zeichenfolge analysieren und Werte bestimmter Textknoten, Attributwerte usw. finden. Ich mache dies in Javascript und verwendet die DOMParser-Klasse für die gleiche. Später wurde mir mitgeteilt, dass DOM viel Speicher beansprucht und SAX eine bessere Option ist.Ist XPath im Vergleich zu DOM und SAX wesentlich effizienter?

Kürzlich fand ich, dass XPath auch eine einfache Möglichkeit bietet, Knoten zu finden.

Aber ich bin mir nicht sicher, welche dieser 3 wäre die effizienteste Möglichkeit, XML zu analysieren. Bitte helfen ....

Antwort

27

SAX ist ein Top-down-Parser und ermöglicht den seriellen Zugriff auf ein XML-Dokument und funktioniert gut für den schreibgeschützten Zugriff. DOM dagegen ist robuster - es liest das gesamte XML-Dokument in eine Baumstruktur und ist sehr effizient, wenn Sie Daten in dieser XML-Baumstruktur ändern, hinzufügen oder entfernen möchten. XPath ist nützlich, wenn Sie nur ein paar Werte aus dem XML-Dokument benötigen und Sie wissen, wo Sie sie finden können (Sie kennen den Pfad der Daten,/root/item/challange/text).

SAX: Zeit effizient, wenn durch das Dokument laufen, gibt einen einzigen Durchgang für jede Iteration

DOM: Flexible/Leistung, gibt Ihnen mehr Möglichkeiten, um Ihre Daten

XPath zu arbeiten: Zeit effizient, wenn Sie nur müssen ein paar Werte lesen

+0

Vergessen Sie nicht, vtd-xml mit integrierter xpath-Implementierung zu erwähnen. –

0

Wenn Sie nur die Werte bestimmter Textknoten finden müssen, dann XPath. Der Grund dafür, dass DOM viel Speicher beansprucht, liegt darin, dass es das gesamte XML einliest und den Baum für das Dokument bildet. SAX ist ereignisbasiert. Daher passt XPath basierend auf dem, was Sie beschrieben haben, am besten zu Ihrem Szenario.

10

Sofern Sie nicht den Forschungsprototyp streaming XPath verwenden, ist es sehr wahrscheinlich, dass Ihre XPath-Engine alles in den Speicher lädt, so dass es ähnliche Eigenschaften wie DOM hat. Es hängt also eher von Ihrer Definition von "Effizienz" ab. Es ist sicherlich einfacher zu verwenden, und die XPath-Implementierungen könnten effizienter werden, während DOM immer eine Darstellung des gesamten Dokuments auf dem Client-Rechner haben wird, und SAX ist immer viel umständlicher zu programmieren als XPath.

+0

Ich finde es merkwürdig, dass die anderen Antworten Ihren Punkt nicht erwähnen, da XPath das Dokument immer noch parsen muss.DOM, SAX und XPath sind verschiedene APIs für den Zugriff auf ein Dokument; aber nur DOM und SAX sind Parser eines Dokuments. Es sei denn, ein #C macht einen Parser für XPath, von dem wir nichts wissen? – 13ren

+0

BTW: Ihr verknüpftes XSQ verwendet SAX zum Parsing unterhalb - es hat keinen spezifischen XPath-Parser. – 13ren

+0

Ja, es ist eine Ebene über einem Streaming-Parser und nicht ein Objektmodell. –

1

This document from MSDN bietet eine Fülle von Informationen zur Optimierung der XML-Verarbeitung.

Insbesondere die XPathDocument-Klasse wurde entwickelt, um die Auswertung von XPath-Ausdrücken effizienter zu gestalten als die Verwendung der (DOM-basierten) XmlDocument-Klasse. Der Grund ist, dass XPathDocument eine schreibgeschützte Darstellung eines XML-Dokuments ist, während eine DOM-Implementierung auch das Ändern des Dokuments umfasst.

Die Verwendung von DOM hat einen nicht weniger wichtigen Nachteil, der in der Regel zu kompliziertem Spaghetti-ähnlichen Code führt, der schwer zu verstehen und zu pflegen ist.

1

Siehe http://code.google.com/p/jlibs/wiki/XMLDog

Wir von XPaths zu XMLDog gesetzt geben und fragen einige XML-Dokument schnuppern. Es verwendet SAX und mit einem Durchlauf über das Dokument bewertet es alle gegebenen XPaths.