题
是否有任何生产准备库对流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 端口。
尝试 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();