XML 读取中的 XPath 性能

Posted

技术标签:

【中文标题】XML 读取中的 XPath 性能【英文标题】:XPath performance in XML reading 【发布时间】:2011-04-19 21:07:18 【问题描述】:

我在 WinForms 中编写了一个类来从 XML 文件中检索一些数据。我的 XML 文件大多很大,大约 5 到 10MB。我对我的代码的性能不满意,因为它有时需要永远处理!所以我希望你检查我的代码,如果我错了,请纠正我。

下面的代码是这个类的一个示例,它加载了一组用于绘制曲线的点:

class TestXML

    // Class initializings
    XmlDocument ztr = new XmlDocument();
    XPathDocument doc;
    XPathNavigator nav;
    XmlNamespaceManager ns;

    string filePath;

    public TestXML(string pathToFile)
    
        this.filePath = pathToFile;

        ztr.Load(filePath);
        doc = new XPathDocument(filePath);
        nav = doc.CreateNavigator();
        ns = new XmlNamespaceManager(nav.NameTable);
    

    public double[,] GetCurveDataPost(string testType, string groupName, string subTestType, string pinName, string testNameContains = "Post VI")
    
        List<double> voltage = new List<double>();
        List<double> current = new List<double>();

        XPathNodeIterator volt = nav.Select("/Document/Tests/Test[contains(Name, '" + testNameContains + "') and Type='" + testType + "']/Groups/Group[Name='" + groupName + "']/CurvesFileData/Pins/Pin[Number='" + pinName + "']/Curves//Curve/VIPairs/VIPair/Voltage");
        XPathNodeIterator curr = nav.Select("/Document/Tests/Test[contains(Name, '" + testNameContains + "') and Type='" + testType + "']/Groups/Group[Name='" + groupName + "']/CurvesFileData/Pins/Pin[Number='" + pinName + "']/Curves//Curve/VIPairs/VIPair/Current");

        foreach (XPathNavigator value in volt)
        
            voltage.Add(Convert.ToDouble(value.Value));
        

        foreach (XPathNavigator value in curr)
        
            current.Add(Convert.ToDouble(value.Value));
        

        double[,] data = new double[voltage.Count(), 2];
        for (int i = 0; i < voltage.Count(); i++)
        
            data[i, 0] = voltage[i];
            data[i, 1] = current[i];
        

        return data;
    

我可以使用这个类加载多个 XML 文件(例如在 TreeVIew 中,节点的每个 Name 属性将是 XML 文件的路径)。但它并不总是有效的。有没有使它更快的解决方法?会不会像先在内存中加载 XML 文件,然后再进行操作?但这会导致高内存依赖。

如果您需要更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

您应该分析您的代码,以确定它的哪些部分需要很长时间。

这可以像在代码周围点缀 fre Debug.WriteLine("MyMarker " + DateTime.Now)(或类似的)语句一样简单,也可以使用 Profiling tool。

也就是说,减速很可能出现在这条线上:

ztr.Load(filePath); // ztr is a XmlDocument

XmlDocument 类读取并解析整个 XML 文件以加载文档,即使您想要的信息实际上在文件开头附近 - 对于大文件,这可能相对低效。

您应该考虑使用 XmlReader 类来读取您的 xml 文档 - 它允许您根据需要逐个元素地读取文档,因此从大型 XML 文档中读取数据可以相当快。然而,权衡是它比XmlDocument 类更难使用

【讨论】:

以上是关于XML 读取中的 XPath 性能的主要内容,如果未能解决你的问题,请参考以下文章

TinyXPath 对于xpath标准的支持测试

xpath中怎样用变量

基于 XML 字段创建视图

XML编程总结——使用dom4j方式操作xml

使用XPath查询读取XML标签

css selector vs xpath 性能比较