2011-04-19 77 views
0

我在WinForms中編寫了一個類來從XML文件中檢索一些數據。我的XML文件大多數都在5到10MB左右。我對代碼的性能不滿意,因爲它有時需要永久​​處理!所以我想讓你檢查我的代碼,如果我錯了,請糾正我。XML閱讀中的XPath性能

下面的代碼是它加載一組點的用於繪製曲線這個類的一個示例:

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; 
    } 
} 

我可以使用一個TreeView內這個類(例如加載多個XML文件,並且每個名稱屬性的節點將成爲XML文件的路徑)。但它並不總是有效。有沒有解決方法使其更快?它可能是像先加載內存中的XML文件,然後做操作?但這會導致高內存依賴性。

請讓我知道如果你需要更多的信息。

回答

2

您應該剖析您的代碼以確定哪些部分需要很長時間。

這可以像圍繞代碼點綴的fre Debug.WriteLine("MyMarker " + DateTime.Now)(或類似)聲明一樣簡單,也可以使用Profiling tool

這就是說,經濟放緩很可能會在這條線:

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

XmlDocument類讀取並分析整個XML文件,以加載文檔,即使你想要的信息其實是附近開始的文件 - 對於大文件,這可能相對低效。

您可以使用XmlReader類來讀取您的xml文檔 - 它允許您按需按元素讀取文檔元素,因此可以更快地讀取大型XML文檔中的數據。然而,權衡是比XmlDocument

更難使用