当前位置 - 養生大全網 - 中醫養生 - 如何用VBA解析XML問題,怎麽解決

如何用VBA解析XML問題,怎麽解決

XML也是儲存數據的壹種常用形式,這節來看下從XML文件中取數據的壹般方法。

壹般來說,如果妳的XML文件結構比較規整的話可以用Excel自帶的功能來直接導入XML形式的文件,在開發工具菜單XML組中找導入,非常方便,今天我們主要來看怎樣用VBA來處理XML文件。

現在我手上有壹個名為Rawdata.xml的XML文件,現在我想要把該文件中所有的數據都取到Excel中,直接看代碼

Private Sub OpenXml1()

Dim objDOM, n, nodes As Object, ns, i, j

Set objDOM = CreateObject("MSXML.DOMDocument")

objDOM.Load (ThisWorkbook.Path & "\Rawdata.xml")

objDOM.async = False

Set ns = objDOM.SelectNodes("//extraction") '取節點extraction,即行

Set n = objDOM.SelectSingleNode("//extraction") '取單個Extraction,其長度即列

For i = 1 To ns.Length

For j = 1 To n.ChildNodes.Length

Cells(i, j) = ns.Item(i - 1).ChildNodes(j - 1).Text

Next

Next

Debug.Print n.ChildNodes.Length

Debug.Print ns.Length

Debug.Print ns.Item(0).Text

Set objDOM = Nothing

End Sub

代碼稍微解釋壹下,先建立壹個DOM對象,然後用Load方法將XML文件內容載入。選取節點用的是SelectNodes,該XML文件中行標簽是extraction,所以我選擇了該節點,那節點的個數就是行數了。獲得單個節點的結構用的是SelectSingleNode,那這單個節點中子節點的個數n.ChildNodes.Length就是列數了。ns.Item(i).ChildNodes(j).text就是節點集ns中第i項的第j個子節點的值,我們要的內容也就取出來了。

那如果我不要取所有的列,只想取某幾列,那怎麽辦,看代碼

Private Sub OpenXml2()

Dim objDOM, n, ns, i, j, strh(), arr()

Cells.Clear

strh = Array("tdx", "tda", "tdb", "tdc", "tdk", "tdl", "tdy", "tdm", "tdn", "tdo", "tdp", "tdq", "tdu", "tdv", "td1", "new1", "new2")

Set objDOM = CreateObject("MSXML.DOMDocument")

objDOM.Load (ThisWorkbook.Path & "\Rawdata.xml")

objDOM.async = False

'MsgBox objDOM.XML

Set ns = objDOM.SelectNodes("//extraction")

Set n = objDOM.SelectSingleNode("//extraction")

ReDim arr(1 To ns.Length, 1 To UBound(strh) + 1)

For i = 1 To ns.Length

For j = 1 To UBound(strh) + 1

On Error Resume Next

arr(i, j) = ns.Item(i - 1).GetElementsByTagname(strh(j - 1)).Item(0).Text

Next

Next

Set ns = Nothing

Set n = Nothing

Set objDOM = Nothing

Range("A1").Resize(UBound(arr), UBound(strh) + 1) = arr

End Sub

上面的代碼就是取以"tdx", "tda", "tdb", "tdc", "tdk", "tdl", "tdy", "tdm", "tdn", "tdo", "tdp", "tdq", "tdu", "tdv", "td1", "new1", "new2"為標簽的列,和前面不同的主要是這句ns.Item(i - 1).GetElementsByTagname(strh(j - 1)).Item(0).Text,用getelementsbytagname(節點名)取節點,ns.Item(i-1)是行節點的第n-1項,從這項中用GetElementsByTagname取出相應的列節點,壹般來說到列了不會有多項了,所以我們直接用第1項(下標是0)的值來表示我們要的結果,之間的層層關系自己體會壹下。