是否有任何生产准备库对流XPath表达的评价对所提供的xml-文件?我的调查显示,大多数现有的解决方案载整个DOM-树入存储器之前评估xpath表达。

有帮助吗?

解决方案

这是实际的完整XPath执行情况,鉴于XPath语法允许:

/AAA/XXX/following::*

/AAA/BBB/following-sibling::*

这意味着前瞻的要求?即从一个特别节点你将要有到负荷的其他文件。

医生的 Nux 图书馆(特别 StreamingPathFilter)使得这一点,并参考文献的一些实现,依赖于一个 的XPath。Nux的权利要求执行一些流媒体的查询功能,但鉴于上述情况会有一些限制条款的XPath执行情况。

其他提示

XSLT提供3.0 流模式的处理 这将成为一个标准的XSLT3.0W3C规范成为一个W3C的建议。

在撰写本文时,这个答案(可能,2011年)提供了一些撒克逊 支持XSLT3.0流 .

有几种选择:

  • DataDirect Technologies 销售 XQuery 实现 在可能的情况下采用投影和流媒体。它可以处理数千兆字节范围的文件 - 例如大于可用内存。它是一个线程安全的库,因此很容易集成。仅限 Java。

  • 撒克逊人 是一个开源版本,有一个价格适中的更昂贵的版本,可以在某些情况下进行流式传输。Java,但也带有 .net 端口。

  • 马克逻辑公司存在 是 XML 数据库,如果将 XML 加载到其中,它们将以相当智能的方式处理 XPath。

尝试 Joost的

虽然我与它没有实践经验,我认为这是值得一提的QuiXProc(的http:// code.google.com/p/quixproc/ )。它是一个流的方法来XPROC,并使用该提供流支持的XPath除其他..文库

FWIW,我用马钱流过滤XPath查询打击非常大(> 3GB)的文件,它是既完美地工作和很少使用的内存。我的使用情况已经略有不同(未验证中心),但我强烈建议你给它与马钱出手了。

我想我会去的自定义代码。 .NET库得到我们非常接近目标,如果只是想读取XML文档的一些路径。

由于所有的解决方案我看到迄今只尊重的XPath子集,这也是这种解决方案。该子集是非常小的,但。 :)

此C#代码读取XML文件,并计数节点给出一个明确的路径。也可以在属性操作容易,使用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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top