Pregunta

¿Hay bibliotecas listos para la producción de streaming de evaluación expresiones XPath contra proporcionada XML-documento? Mis investigaciones muestran que la mayoría de las soluciones existentes cargar todo DOM-árbol en la memoria antes de evaluar la expresión XPath.

¿Fue útil?

Solución

¿Esto sería práctico para una implementación completa de XPath, dado que la sintaxis XPath permite:

/AAA/XXX/following::*

y

/AAA/BBB/following-sibling::*

lo que implica requisitos de preanálisis? es decir, desde un nodo particular que va a tener que cargar el resto del documento de todos modos.

El doc para la href="http://acs.lbl.gov/nux/" rel="nofollow noreferrer"> Nux biblioteca (específicamente StreamingPathFilter ) hace este punto, y las referencias en algunas implementaciones que se basan en un subconjunto de XPath. Nux pretende realizar alguna capacidad de consulta de streaming, pero teniendo en cuenta lo anterior, habrá algunas limitaciones en cuanto a la implementación de XPath.

Otros consejos

XSLT 3.0 proporciona modo de procesamiento y esto se convertirá en un estándar con la especificación W3C XSLT 3,0 convertirse en una Recomendación W3C.

En el momento de escribir esta respuesta (mayo de 2011) Saxon proporciona algunos soporte para XSLT 3.0 streaming de .

Hay varias opciones:

  • DataDirect Technologies vende una aplicación XQuery que emplea la proyección y la transmisión, siempre que sea posible. Puede manejar archivos en el rango de varios gigabytes - por ejemplo, más grande que la memoria disponible. Es una librería de hilos de seguridad, por lo que es fácil de integrar. Java-solamente.

  • Saxon es una versión de código abierto, con una prima más cara de precio modesto, lo cual lo hará en streaming en algunos contextos. Java, pero con un puerto NET también.

  • MarkLogic y existo son bases de datos XML que, si el código XML se carga en ellos, procesarán XPaths de una manera bastante inteligente.

Trate Joost .

Aunque no tengo experiencia práctica con él, pensé que vale la pena mencionar QuiXProc ( http: // code.google.com/p/quixproc/ ). Es un enfoque de streaming a XProc, y utiliza las bibliotecas que proporcionan soporte para streaming de XPath entre otros ..

Fwiw, he utilizado Nux consultas XPath filtro de transmisión en contra muy grandes (> 3 GB) archivos, y es a la vez funcionó a la perfección y se utiliza muy poca memoria. Mi caso de uso es resultado ligeramente diferente (no la validación céntrica), pero altamente te animo a darle un tiro con Nux.

Creo que voy a ir a por un código personalizado. NET nos pone muy cerca de la meta, si uno sólo quiere leer algunos caminos del documento XML.

Dado que todas las soluciones que veo hasta ahora exclusivamente por subconjunto de XPath, esto es también este tipo de solución. El subconjunto es realmente pequeño. :)

Este código C # lee el archivo XML y el recuento de nodos dado una ruta explícita. También puede operar en los atributos con facilidad, utilizando la sintaxis 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top