Question

Y a-t-il des bibliothèques de prêts à la production pour le streaming évaluation des expressions XPath document XML fourni? Mes enquêtes montrent que la plupart des solutions existantes charger DOM-arbre entier dans la mémoire avant d'évaluer l'expression XPath.

Était-ce utile?

La solution

Serait-ce pratique pour une mise en œuvre complète de XPath, étant donné que la syntaxe XPath permet:

/AAA/XXX/following::*

et

/AAA/BBB/following-sibling::*

ce qui implique des exigences look à venir? à-dire à partir d'un nœud particulier que vous allez devoir charger le reste du document de toute façon.

Le doc pour le Nux bibliothèque (en particulier StreamingPathFilter ) fait ce point, et les références certaines implémentations qui reposent sur un sous-ensemble de XPath. Nux prétend effectuer une capacité de requête en streaming, mais étant donné ce qui précède, il y aura des limites en termes de mise en œuvre XPath.

Autres conseils

XSLT 3.0 fournit en mode continu de traitement et cela deviendra une norme avec la spécification du W3C XSLT 3.0 devient une recommandation du W3C.

Au moment de la rédaction de cette réponse (mai 2011) Saxon fournit une support pour XSLT 3.0 en continu .

Il y a plusieurs options:

  • DataDirect Technologies vend une implémentation XQuery qui utilise la projection et le streaming, lorsque cela est possible. Il peut gérer des fichiers dans la gamme de plusieurs giga-octets - par exemple plus grande que la mémoire disponible. Il est une bibliothèque de thread-safe, il est donc facile à intégrer. Java uniquement.

  • saxon est une version open-source, avec un cousin plus cher à prix modique, qui fera le streaming dans certains contextes. Java, mais avec un port .net aussi.

  • MarkLogic et eXist sont des bases de données XML, si votre XML est chargé en eux, vont passer XPath d'une manière assez intelligente.

Bien que je n'ai aucune expérience pratique avec elle, je pensais qu'il convient de mentionner QuiXProc ( http: // code.google.com/p/quixproc/ ). Il est une approche de streaming à XProc, et utilise des bibliothèques qui offrent un soutien en diffusion continue XPath entre autres ..

FWIW, je l'ai utilisé Nux requêtes XPath filtre en continu contre les très gros fichiers (> 3GB), et il est à la fois travaillé parfaitement et utilisé très peu de mémoire. Mon cas d'utilisation est été légèrement différente (pas centrée sur la validation), mais je voudrais fortement encourager à donner un coup de feu avec Nux.

Je crois que je vais pour le code personnalisé. bibliothèque .NET nous amène tout près de la cible, si l'on veut juste lire quelques chemins du document XML.

Étant donné que toutes les solutions que je vois respecte jusqu'à présent que sous-ensemble XPath, c'est aussi ce genre de solution. Le sous-ensemble est vraiment petite. :)

Ce code C # lit le fichier xml et nœuds counts donner un chemin explicite. Vous pouvez également utiliser des attributs facilement, en utilisant la syntaxe 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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top