【发布时间】:2014-11-19 23:28:30
【问题描述】:
我必须将多个巨大的 xml 数据文件导入 Excel。我不能使用简单的loadXML() 函数,因为 Excel 没有足够的可用 RAM。 (一些 xml 文件约为 100mb)
现在我真的尝试了很多......但根本无法真正实现它。 示例 XML 文件:
<OMDS xmlns="urn:omds20" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:omds20 ./omds24-00.xsd">
<PAKET VUNr="1" MaklerID="2" PaketZpktErstell="x" PaketZpktLetztErstell="y">
<PROVISION ProvisionsID="123" Polizzennr="321" Vermnr="5" BuchDat="2013-02-27"/>
<PROVISION ProvisionsID="456" Polizzennr="321" Vermnr="5" BuchDat="2013-02-27"/>
<PROVISION ProvisionsID="789" Polizzennr="321" Vermnr="5" BuchDat="2013-02-27"/>
</PAKET>
</OMDS>
所以我在 VBA 中的内容是这样的:
Sub ParseXmlDocument()
Dim doc As New MSXML2.DOMDocument
Dim success As Boolean
success = doc.Load(App.Path & "\test.xml")
If success = False Then
MsgBox doc.parseError.reason
Else
Dim nodeList As MSXML2.IXMLDOMNodeList
Set nodeList = doc.selectNodes("/OMDS/PAKET/PROVISION")
If Not nodeList Is Nothing Then
Dim node As MSXML2.IXMLDOMNode
Dim idAs String
Dim value As String
For Each node In nodeList
id= node.selectSingleNode("ProvisionsID").Text
Next node
End If
End If
End Sub
在那之后,我只是想在MsgBox 中打印 ID,但由于nodeList 总是显示为空,我无法实现。
希望有人可以帮助我。
感谢 GSerg,我能够解决问题。 解决方案
Sub ParseXmlDocument()
Dim doc As New MSXML2.DOMDocument
Dim success As Boolean
With doc
.async = False
.setProperty "SelectionLanguage", "XPath"
.setProperty "SelectionNamespaces", "xmlns:t='urn:omds20'"
End With
success = doc.Load("C:\...\demo.xml")
If success = False Then
MsgBox doc.parseError.reason
Else
Dim nodeList As MSXML2.IXMLDOMNodeList
Set nodeList = doc.SelectNodes("/t:OMDS/t:PAKET/t:PROVISION")
If Not nodeList Is Nothing Then
Dim node As MSXML2.IXMLDOMNode
Dim id As String
Dim value As String
For Each node In nodeList
id = node.SelectSingleNode("@ProvisionsID").Text
Next node
End If
End If
End Sub
【问题讨论】:
-
您的节点属于命名空间,但您没有在 xpath 查询中提供任何命名空间。
Load也是异步的,除非使用了.async = False,因此您在加载完成之前检查是否成功。 -
如何为 xpath 查询提供命名空间?第一次使用 XML sry :-/ 感谢异步的提示 :)
-
对不起,我真的不明白...
-
阅读my answer 了解如何在
doc上设置所需属性,阅读Robert Rossney's answer 了解原因。