單純用DataSet的ReadXml方法讀取XML對於小數據量來說效率很高,但是對大數據量的XML來說就有些力不從心了。
比如,讓DataSet讀取一個16M的XML,能讓你等到地老天荒。如果你的機器配置不高,那肯定死的很難看、很窩囊。
咱不能見死不救不是,請往下看。
題外話:如果XML來自DataSet,那麼你是幸運的。你可以DataSet把架構信息帶上,別因膨脹那麼幾k的數據就捨不得了。
ReadXML缺省使用XMLReadMode.Auto方式讀取,這就給大數據量留下了低效率的伏筆。
因為如果XML沒有Scheme,DataSet就會自己推算XML的結構,然後再加載,這就是低效的主要原因。
讓DataSet推算不讓我們幫他算,因為DataSet已經提供了一個ReadXMLSchema方法。
如下:
Dim XMLText As String ''保存了XML的文本
Dim MyDs As New DataSet
Dim MyTab As DataTable
''加載架構
MyDs.ReadXmlSchema(New IO.StringReader(XMLText))
For Each MyTab In MyDs.Tables
MyTab.BeginLoadData()
Next
然後再讓DataSet加載數據。
注意:因為前面我們一個幫他加載架構信息了,這裡就可以讓DataSet加載數據時忽略Schema。
''加載數據
MyDs.ReadXml(New IO.StringReader(XMLText), XMLReadMode.IgnoreSchema)
For Each MyTab In MyDs.Tables
MyTab.EndLoadData()
Next
Ok,這樣就把數據快速的加載到DataSet了。經過實際測試,數據量越大效率比就越高。
通常獲得DataSet的XML的方法是用GetXML,確實方便。但是返回的結果已經把DataSet的架構信息抹掉了,剩下的是單純的數據。
DataSet還給我們留了一個WriteXML方法(感動ing,勿擾....),這個方法可以把DataSet的數據寫到文件或流中。
比如:
Dim MS As New IO.MemoryStream
DataSet.WriteXml(MS, XMLWriteMode.WriteSchema) ''後面參數是關鍵,指明要帶上架構信息。
這樣在MS這個流中就保存了帶DataSet架構信息的全部數據。