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 性能的主要内容,如果未能解决你的问题,请参考以下文章