Pergunta

Existem quaisquer bibliotecas prontos para produção para streaming de avaliação XPath expressões contra fornecido xml-documento? Minhas investigações mostram que a maioria das soluções existentes carregar toda DOM-árvore na memória antes de avaliar a expressão XPath.

Foi útil?

Solução

Será que isso é prático para uma implementação completa XPath, uma vez que a sintaxe XPath permite:

/AAA/XXX/following::*

e

/AAA/BBB/following-sibling::*

que implica requisitos look-ahead? ou seja, a partir de um nó específico que você vai ter que carregar o resto do documento de qualquer maneira.

O doc para o href="http://acs.lbl.gov/nux/" rel="nofollow noreferrer"> Nux biblioteca (especificamente StreamingPathFilter ) torna este ponto, e referências algumas implementações que dependem de um subconjunto de XPath. reivindicações Nux para executar alguma capacidade de consulta de streaming, mas dadas as acima, haverá algumas limitações em termos de implementação XPath.

Outras dicas

XSLT 3.0 fornece modo de processamento e este se tornará um padrão com a especificação W3C XSLT 3.0 tornando-se uma Recomendação W3C.

No momento de escrever esta resposta (maio de 2011) Saxon fornece alguns suporte para XSLT 3.0 streaming de .

Existem várias opções:

  • DataDirect Technologies vende um implementação XQuery que utiliza projeção e streaming, sempre que possível. Ele pode lidar com arquivos para a faixa de multi-gigabyte - por exemplo, maior do que a memória disponível. É uma biblioteca thread-safe, por isso é fácil de integrar. Java-only.

  • Saxon é uma versão open-source, com um primo mais caro preço modesto, que vai fazer streaming de em alguns contextos. Java, mas com uma porta .net também.

  • MarkLogic e eXist são bancos de dados XML que, se o XML é carregado para eles, vai processar XPaths de uma forma bastante inteligente.

Tente Joost .

Embora eu não tenho nenhuma experiência prática com ele, eu pensei que vale a pena mencionar QuiXProc ( http: // code.google.com/p/quixproc/ ). É uma abordagem streaming para XProc e usa bibliotecas que fornecem streaming de suporte para XPath entre outros ..

FWIW, eu usei Nux streaming de consultas XPath filtro contra (> 3 GB) arquivos muito grandes, e é tanto funcionou perfeitamente e usou muito pouca memória. Meu caso de uso é sido um pouco diferente (não validação centric), mas eu altamente incentivá-lo a dar-lhe um tiro com Nux.

Eu acho que vou para o código personalizado. biblioteca .NET nos fica muito perto do alvo, se um quer apenas ler alguns caminhos do documento XML.

Uma vez que todas as soluções que vejo até agora, apenas relativamente subconjunto XPath, este é também este tipo de solução. O subconjunto é muito pequeno embora. :)

Este código C # lê arquivo xml e nós contagens dado um caminho explícito. Você também pode operar em atributos facilmente, usando a sintaxe 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top