流式XPath评估

是否有任何生产就绪库可用于针对提供的xml文档进行流式XPath表达式评估? 我的调查表明,大多数现有解决方案在评估xpath表达式之前将整个DOM树加载到内存中。

这是否适用于完整的XPath实现,因为XPath语法允许:

/AAA/XXX/following::* 

 /AAA/BBB/following-sibling::* 

这意味着前瞻性要求? 即从一个特定的节点,你将不得不加载文档的其余部分。

Nux库的文档(特别是StreamingPathFilter )提出了这一点,并引用了一些依赖于XPath 子集的实现。 Nux声称可以执行一些流式查询function,但鉴于上述内容,XPath实现方面会有一些限制。

XSLT 3.0提供流处理模式,这将成为XSLT 3.0 W3C规范成为W3C建议书的标准。

在撰写本答案时(2011年5月),Saxon 为XSLT 3.0流媒体提供了一些支持

有几种选择:

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

  • Saxon是一个开源版本,价格适中,价格适中,表兄弟会在某些情况下进行流媒体播放。 Java,但也有.net端口。

  • MarkLogic和eXist是XML数据库,如果将XML加载到这些数据库中,它们将以相当智能的方式处理XPath。

试试Joost 。

虽然我没有实际操作经验,但我认为值得一提的是QuiXProc( http://code.google.com/p/quixproc/ )。 它是XProc的流式处理方法,并使用为XPath提供流式支持的库。

FWIW,我已经对非常大(> 3GB)的文件使用了Nux流式filterxpath查询,并且它们都运行完美且使用的内存非常少。 我的用例略有不同(不是以validation为中心),但我非常鼓励你用Nux来试一试。

我想我会选择自定义代码。 如果只想读取xml文档的某些路径,.NET库会让我们非常接近目标。

由于到目前为止我看到的所有解决方案都只考虑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(); 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();