Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net-从System.Xml迁移到Saxon.Api性能问题_C#_Xml_Xpath_Xml Parsing_Saxon - Fatal编程技术网

C# .Net-从System.Xml迁移到Saxon.Api性能问题

C# .Net-从System.Xml迁移到Saxon.Api性能问题,c#,xml,xpath,xml-parsing,saxon,C#,Xml,Xpath,Xml Parsing,Saxon,我已经编写了一个C#应用程序来解析非常大(100MB+)的XML文件 我完成它的方式是使用System.Xml.XmlReader遍历文件,然后,一旦到达需要从中收集值的最终节点,我将这些非常小的元素转换为System.Xml.Linq.XElement,并通过XEelement.xpatheevaluate执行各种XPath语句,以获取所需的数据 这非常有效,但我遇到了一个问题,因为xpatheevaluate只支持XPath1.0,而我的语句是XPath2.0(问题已发布),所以有时会得到错

我已经编写了一个C#应用程序来解析非常大(100MB+)的XML文件

我完成它的方式是使用
System.Xml.XmlReader
遍历文件,然后,一旦到达需要从中收集值的最终节点,我将这些非常小的元素转换为
System.Xml.Linq.XElement
,并通过
XEelement.xpatheevaluate
执行各种XPath语句,以获取所需的数据

这非常有效,但我遇到了一个问题,因为
xpatheevaluate
只支持XPath1.0,而我的语句是XPath2.0(问题已发布),所以有时会得到错误的数据

我最初执行此操作的代码如下所示:

void parseNode_Old(XmlReader rdr, List<string> xPathsToExtract)
{
    // Enter the node:
    rdr.Read();

    // Load it as an XElement so as to be able to evaluate XPaths:
    var nd = XElement.Load(rdr);

    // Loop through the XPaths related to that node and evaluate them:
    foreach (var xPath in xPathsToExtract)
    {
        var xPathVal = nd.XPathEvaluate(xPath);

        // Do whatever with the extracted value(s)
    }
}
void parseNode_Saxon(XmlReader rdr, List<string> xPathsToExtract)
{
    // Set up the Saxon XPath processors:
    Processor processor = new Processor(false);
    XPathCompiler compiler = processor.NewXPathCompiler();
    XdmNode nd = processor.NewDocumentBuilder().Build(rdr);

    // Loop through the XPaths related to that node and evaluate them:
    foreach (var xPath in xPathsToExtract)
    {
        var xPathVal = compiler.EvaluateSingle(xPath, (XdmNode)childNode);

        // Do whatever with the extracted value(s)
    }
}
这是可行的(对我的XPath进行了一些其他更改),但速度已经慢了5-10倍

这是我第一次使用Saxon.Api库,这就是我想到的。我希望有更好的方法来实现这一点,以使代码执行速度具有可比性,或者,如果有人对如何在不进行大量重写的情况下以更好的方式计算XPath 2.0语句有其他想法,我很乐意听到他们

任何帮助都将不胜感激

谢谢

更新:

为了自己解决这个问题,我将以下两条语句移到了构造函数中:

Processor processor = new Processor(false);
XPathCompiler compiler = processor.NewXPathCompiler();

与每次调用该方法时不断地重新创建它们相反,该方法起到了很大的帮助,但是该过程仍然比本机
System.Xml.Linq
版本慢3倍左右。关于实现此解析器的方法还有其他想法吗?

这可能是您使用此设置所能做到的最好方法

NET的速度通常是Saxon-Java的3-5倍,这是我们从未弄清的原因。我们目前正在探索使用Excelsior JET而不是IKVMC重建它的可能性,看看这是否可以加快速度

Saxon在第三方DOM实现上比在其自身的本机树表示上慢得多,但是您似乎已经更改了代码以使用本机树模型


由于每次执行XPath表达式时都要对其进行解析,因此XPath编译时间可能会决定性能(即使搜索的是大型XML文档)。直到最近,Saxon的编译时性能还很少受到关注,因为我们认为在编译时做更多的工作以节省运行时的工作量总是值得的;但在这种情况下,情况显然不是这样。可能值得将编译时和运行时分开,并分别进行测量,看看这是否能提供一些见解。例如,它可能建议关闭一些优化选项。显然,如果您可以缓存和重用编译的XPath表达式,这将有所帮助

非常感谢,迈克尔,我希望我的编码有点小问题。。。很遗憾,因为它是一个如此深的图书馆,能够使用。但是,对于这个特定的项目,使用不同的项目可能最有意义。又是坦克!!!