[英]Reading multiple XML Files via VB6
我必须将多个巨大的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
您的源XML包含名称空间,但您的xPath查询不包含名称空间。 因此,xPath将寻找名称空间为空的节点,而您没有任何节点。
为了修复它,您需要在xPath查询中提供一个名称空间。 实现方法因所使用的XML库而异 。 对于MSXML,您需要在DOMDocument
对象上设置SelectionNamespaces
属性以包含带有前缀的名称空间:
doc.setProperty("SelectionNamespaces", "xmlns:t='urn:omds20'")
然后更改您的查询以使用该前缀:
Set nodeList = doc.selectNodes("/t:OMDS/t:PAKET/t:PROVISION")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.