Frage

Gibt es produktionsfertige Bibliotheken für das Streaming von XPath-Ausdrücken Auswertung gegen vorgesehen xml-Dokument? Meine Untersuchungen zeigen, dass die meisten bestehenden Lösungen laden gesamte DOM-Baum in den Speicher vor XPath-Ausdruck zu bewerten.

War es hilfreich?

Lösung

Würde dies für eine vollständige XPath Implementierung praktisch sein, da die XPath-Syntax ermöglicht:

/AAA/XXX/following::*

und

/AAA/BBB/following-sibling::*

die Vorgriffs Anforderungen impliziert? das heißt von einem bestimmten Knoten Sie gehen ohnehin den Rest des Dokuments müssen geladen werden.

Der Doc für die Nux Bibliothek (genauer gesagt: StreamingPathFilter ) macht diesen Punkt, und Referenzen einige Implementierungen, die auf einem Untergruppe von XPath. Nux behauptet, einige Streaming-Abfragefunktion durchzuführen, aber die oben dort gegeben werden einige Einschränkungen in Bezug auf die XPath Implementierung sein.

Andere Tipps

XSLT 3.0 bietet Streaming-Modus der Verarbeitung und dies wird ein Standard mit der XSLT 3.0 W3C-Spezifikation zu einer W3C-Empfehlung werden.

Zum Zeitpunkt des Schreibens dieser Antwort (Mai 2011) Saxon bietet einige Unterstützung für XSLT 3.0 Streaming .

Es gibt mehrere Möglichkeiten:

  • Datadirect Technologies verkauft eine XQuery-Implementierung die Projektion und Streaming verwendet, wo dies möglich. Es können Dateien in den Multi-Gigabyte-Bereich verarbeiten - z.B. größer als der verfügbare Speicher. Es ist eine Thread-sichere Bibliothek, so ist es einfach zu integrieren. Java-only.

  • Saxon ist eine Open-Source-Version, mit bescheidener preisige teurer Vetter, die tun Streaming in manchen Kontexten wird. Java, aber mit einem .net-Port auch.

  • und Marklogic eXist XML-Datenbanken sind, die, wenn Ihr XML in sie geladen ist, wird XPaths in einer ziemlich intelligente Art und Weise verarbeiten.

Versuchen Sie Joost .

Auch wenn ich damit keine praktische Erfahrung haben, dachte ich, es lohnt sich QuiXProc zu erwähnen ( http: // code.google.com/p/quixproc/ ). Es ist ein Streaming-Ansatz zu XProc und verwendet Bibliotheken, die Unterstützung unter anderem für XPath bieten Streaming ..

FWIW, habe ich Nux-Streaming-Filter XPath-Abfragen sehr große (> 3 GB) Dateien verwendet, und es ist beides funktionierte einwandfrei und sehr wenig Speicher. Mein Anwendungsfall ist etwas anders (nicht Validierung centric), aber ich würde sehr empfehlen Sie, es mit Nux einen Schuss zu geben.

Ich glaube, ich für benutzerdefinierten Code gehen würde. NET-Bibliothek bringt uns an das Ziel ganz nahe, wenn man nur ein paar Pfade des XML-Dokuments lesen will.

Da alle Lösungen, die ich bisher sehen nur Teilmenge XPath respektieren, ist dies auch diese Art der Lösung. Die Teilmenge ist allerdings wirklich klein. :)

Der C # -Code liest XML-Datei und zählen Knoten einen expliziten Pfad gegeben. Sie können auch einfach auf Attributen arbeiten, xr["attrName"] Syntax.

  int c = 0;
  var r = new System.IO.StreamReader(asArgs[1]);
  var se = new System.Xml.XmlReaderSettings();
  var xr = System.Xml.XmlReader.Create(r, se);
  var lstPath = new System.Collections.Generic.List<String>();
  var sbPath = new System.Text.StringBuilder();
  while (xr.Read()) {
    //Console.WriteLine("type " + xr.NodeType);
    if (xr.NodeType == System.Xml.XmlNodeType.Element) {
      lstPath.Add(xr.Name);
    }

    // It takes some time. If 1 unit is time needed for parsing the file,
    // then this takes about 1.0.
    sbPath.Clear();
    foreach(object n in lstPath) {
      sbPath.Append('/');
      sbPath.Append(n);
    }
    // This takes about 0.6 time units.
    string sPath = sbPath.ToString();

    if (xr.NodeType == System.Xml.XmlNodeType.EndElement
        || xr.IsEmptyElement) {
      if (xr.Name == "someElement" && lstPath[0] == "main")
        c++;
      // And test simple XPath explicitly:
      // if (sPath == "/main/someElement")
    }

    if (xr.NodeType == System.Xml.XmlNodeType.EndElement
        || xr.IsEmptyElement) {
      lstPath.RemoveAt(lstPath.Count - 1);
    }
  }
  xr.Close();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top