下面列出微軟.net類庫提供的讀寫xml文件個類及其特點:
類名稱 | 優點 | 缺點 |
XmlReader | 快速、高效、可擴展 | 只讀,只向前,需要人工驗證 |
XmlDocument | 可往返、可讀寫、支持XPath篩選 | 比XmlReader慢 |
XPathNavigator | 可往返,支持XPath和XSLT | 只讀 |
XPathDocument | 比XmlDocument,優化支持XPath和XSLT | 比XmlReader慢 |
本文提到的XmlReader也是微軟類庫中的一個類,它的特點是快速高效,並且可擴展,缺點是隻讀。
本人關於這三個做了一個性能測試
條件:做100000次,每次都進行XML的加載和一個節點的讀取,所共的時間如下
xpath: 03.265625
dom: 02.625
xmlreader: 0.140625
其中xpath和dom比較類似,大部分時間都在加載XML上,節點查找倒是挺快的,而xmlreader則是邊加載邊查找,不需要完全加載完纔開始查找節點,可以用於大容量的XML讀取,便代碼編寫上沒有前兩個快捷
DateTime dt1, dt2;
string linkId;
dt1 = DateTime.Now;
for (int i = 0; i < 100000; i++)
{
linkId = XPathTest(strXml);
}
dt2 = DateTime.Now;
Console.WriteLine("XPathTest: {0}", dt2 - dt1);
dt1 = DateTime.Now;
for (int i = 0; i < 100000; i++)
{
linkId = DOMTest(strXml);
}
dt2 = DateTime.Now;
Console.WriteLine("DOMTest: {0}", dt2 - dt1);
dt1 = DateTime.Now;
for (int i = 0; i < 100000; i++)
{
linkId = XmlReaderTest(strXml);
}
dt2 = DateTime.Now;
Console.WriteLine("XmlReaderTest: {0}", dt2 - dt1);
//XmlStream.Close();
Console.ReadLine();
#region XPathTest
static string XPathTest(string strXml)
{
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.LoadXml(strXml);
//XmlNode linkId0 = XmlDoc.SelectSingleNode("Response/SessionID");
//XmlNode linkId1 = XmlDoc.SelectSingleNode("Response/Result/Item/LastFeed");
//XmlNode linkId2 = XmlDoc.SelectSingleNode("Response/Result/Item/LandStatus");
//XmlNode linkId3 = XmlDoc.SelectSingleNode("Response/Result/Item/AnimalID");
//XmlNode linkId4 = XmlDoc.SelectSingleNode("Response/Result/Item/RaiseTime");
//XmlNode linkId5 = XmlDoc.SelectSingleNode("Response/Result/Item/AnimalName");
XmlNode linkId = XmlDoc.SelectSingleNode("Response/Result/Item/LandID");
return linkId.InnerXml;
}
#endregion
#region DOMTest
static string DOMTest(string strXml)
{
XmlDocument XmlDoc = new XmlDocument();
XmlDoc.LoadXml(strXml);
//XmlNode linkId0 = XmlDoc["Response"]["SessionID"];
//XmlNode linkId1 = XmlDoc["Response"]["Result"]["Item"]["LastFeed"];
//XmlNode linkId2 = XmlDoc["Response"]["Result"]["Item"]["LandStatus"];
//XmlNode linkId3 = XmlDoc["Response"]["Result"]["Item"]["AnimalID"];
//XmlNode linkId4 = XmlDoc["Response"]["Result"]["Item"]["RaiseTime"];
//XmlNode linkId5 = XmlDoc["Response"]["Result"]["Item"]["AnimalName"];
XmlNode linkId = XmlDoc["Response"]["Result"]["Item"]["LandID"];
return linkId.InnerXml;
}
#endregion
#region XmlReaderTest
static string XmlReaderTest(string strXml)
{
string restr = "";
MemoryStream XmlStream = new MemoryStream();
byte[] bytes = Encoding.UTF8.GetBytes(strXml);
XmlStream.Write(bytes, 0, bytes.Length);
XmlStream.Position = 0;
XmlTextReader reader = new XmlTextReader(new StreamReader(XmlStream));
while (reader.Read() && reader.Name != "Response") ;
while (reader.Read() && reader.Name != "Result") ;
while (reader.Read() && reader.Name != "Item") ;
while (reader.Read() && reader.Name != "LandID") ;
restr = reader.ReadString();
XmlStream.Close();
return restr;
}
#endregion