发新话题
打印

用DataSet.ReadXml读取无Scheme的XML提速方法

用DataSet.ReadXml读取无Scheme的XML提速方法

(声明:魏滔序原创,转贴请注明出处。)
; N) e8 L$ Z: y  F单纯用DataSet的ReadXml方法读取XML对于小数据量来说效率很高,但是对大数据量的XML来说就有些力不从心了。. e- U+ Q# d: B6 V2 ~
比如,让DataSet读取一个16M的XML,能让你等到地老天荒。如果你的机器配置不高,那肯定死的很难看、很窝囊。; T- ]0 m/ Z3 C1 S- J# g1 n. P. \/ [8 I
咱不能见死不救不是,请往下看。
2 K. y, T+ X, l5 R* q
9 Z2 l; g) m6 {$ e' t题外话:如果XML来自DataSet,那么你是幸运的。你可以DataSet把架构信息带上,别因膨胀那么几k的数据就舍不得了。3 g6 c1 c2 ?+ z( o8 L& @6 {

6 V6 v6 V+ h3 k9 vReadXML缺省使用XmlReadMode.Auto方式读取,这就给大数据量留下了低效率的伏笔。
" O% P6 \$ \6 {+ m0 g( r9 \* O7 Y因为如果XML没有Scheme,DataSet就会自己推算XML的结构,然后再加载,这就是低效的主要原因。3 F) x% y$ B9 X: Y  D$ R5 w
让DataSet推算不让我们帮他算,因为DataSet已经提供了一个ReadXmlSchema方法。
3 H$ a/ x' l; Y4 q如下:
1 Y8 N0 Q5 J2 v9 F# r( f. O- O6 Y, P$ j
Dim XMLText As String '保存了XML的文本" T- D$ N* H' K0 ?9 P: w) i- f
Dim MyDs As New DataSet
3 ]3 B3 E, V* E6 i1 \6 xDim MyTab As DataTable0 \8 W1 w; ^: v. M7 V# n; G
1 J* f& _- v, |
'加载架构
3 @/ g* {2 d- @' i# ^! }MyDs.ReadXmlSchema(New IO.StringReader(XMLText))+ u7 v. A# B, c, f
For Each MyTab In MyDs.Tables" V  _$ J& I! i/ c; T. l
MyTab.BeginLoadData()- j! ?: l( r. t2 \# W2 O- D
Next* p& H1 B9 a6 i6 i

2 P2 }$ w% p& g
- m/ t5 x! z$ s然后再让DataSet加载数据。
6 s! Q8 j" |- P7 F注意:因为前面我们一个帮他加载架构信息了,这里就可以让DataSet加载数据时忽略Schema。0 O) B; `8 C( Z9 u
'加载数据2 {! Y6 O$ p4 `. Z; i% x9 q+ S
MyDs.ReadXml(New IO.StringReader(XMLText), XmlReadMode.IgnoreSchema)9 a$ M; `+ A8 ~
For Each MyTab In MyDs.Tables
- e: X* _: V: t+ X" x* ?! lMyTab.EndLoadData()& }, ^0 o# f+ ^9 K. a0 M
Next
' J3 J) W4 S5 `# ^6 l" ?  C/ Q; J8 R  ~% C
Ok,这样就把数据快速的加载到DataSet了。经过实际测试,数据量越大效率比就越高。 - F3 q% F8 P. M% }- i% D: e2 o

; O' v' D9 O; S4 n * G& B7 c. l' m  r

3 Y( D7 O5 p2 C! t" d% R. |通常获得DataSet的XML的方法是用GetXml,确实方便。但是返回的结果已经把DataSet的架构信息抹掉了,剩下的是单纯的数据。/ q8 U! k) V/ V# ?1 a7 f, |
DataSet还给我们留了一个WriteXml方法(感动ing,勿扰....),这个方法可以把DataSet的数据写到文件或流中。
" _  F/ b+ C$ h6 I& Y比如:
# ]% k! K9 K) UDim MS As New IO.MemoryStream/ m# m' l! t' q! N
DataSet.WriteXml(MS, XmlWriteMode.WriteSchema) '后面参数是关键,指明要带上架构信息。
3 P. o' j! m% `这样在MS这个流中就保存了带DataSet架构信息的全部数据。
赠人玫瑰,手有余香。

TOP

发新话题