Domanda

Ci sono le librerie pronti per la produzione per lo streaming di valutazione di espressioni XPath fornito xml-documento? Le mie ricerche mostrano che la maggior parte delle soluzioni esistenti caricare tutto il DOM-albero in memoria prima di valutare l'espressione XPath.

È stato utile?

Soluzione

Questo sarebbe pratico per una completa implementazione XPath, dato che la sintassi XPath permette di:

/AAA/XXX/following::*

e

/AAA/BBB/following-sibling::*

che implica requisiti di look-ahead? vale a dire da un particolare nodo che si sta andando ad avere per caricare il resto del documento in ogni caso.

Il doc per il Nux biblioteca (in particolare StreamingPathFilter ) rende questo punto, e riferimenti alcune implementazioni che si basano su un sottoinsieme di XPath. Nux afferma di eseguire alcune funzionalità di query di streaming, ma dato quanto sopra ci saranno alcune limitazioni in termini di attuazione XPath.

Altri suggerimenti

XSLT 3.0 fornisce modalità del trattamento e questo diventerà uno standard con la specifica W3C XSLT 3.0 diventando una raccomandazione del W3C.

Al momento della stesura di questa risposta (maggio, 2011) Saxon fornisce alcune il supporto per XSLT 3.0 lo streaming .

Ci sono diverse opzioni:

  • DataDirect Technologies vende un'implementazione XQuery che impiega la proiezione e lo streaming, ove possibile. E 'in grado di gestire i file nella gamma multi-gigabyte - per esempio più grande di memoria disponibile. Si tratta di una libreria di thread-safe, quindi è facile da integrare. Java-only.

  • sassone è una versione open-source, con un cugino più costoso modestamente prezzo, che farà in streaming in alcuni contesti. Java, ma con una porta .net anche.

  • Mark Logic e esiste sono basi di dati XML che, se il vostro XML viene caricato in loro, tratteranno XPaths in modo abbastanza intelligente.

Anche se non ho esperienza pratica con esso, ho pensato che vale la pena ricordare QuiXProc ( http: // code.google.com/p/quixproc/ ). Si tratta di un approccio di streaming per XProc, e usa le librerie che forniscono il supporto per lo streaming XPath tra gli altri ..

FWIW, ho usato Nux query filtro in streaming XPath contro i file di grandi dimensioni (> 3 GB), ed è sia lavorato in modo impeccabile e utilizzati molto poca memoria. Il mio caso d'uso è stata leggermente diversa (non convalida centric), ma mi piacerebbe altamente vi incoraggio a dare un colpo con Nux.

Credo che andrò per il codice personalizzato. Biblioteca NET ottiene noi molto vicino al bersaglio, se uno vuole solo leggere alcuni percorsi del documento XML.

Poiché tutte le soluzioni che vedo finora soltanto per sottoinsieme XPath, questo è anche questo tipo di soluzione. Il sottoinsieme è davvero piccola. :)

Il codice C # legge file XML e nodi conta dato un percorso esplicito. È anche possibile operare su attributi facilmente, utilizzando la sintassi xr["attrName"].

  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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top