【问题标题】:Reading multiple XML Files via VB6通过 VB6 读取多个 XML 文件
【发布时间】: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 了解原因。

标签: xml excel vb6 vba


【解决方案1】:

您的源 XML 包含名称空间,但您的 xPath 查询不包含。因此,xPath 将寻找具有空命名空间的节点,而您没有任何命名空间。

为了修复它,您需要在 xPath 查询中提供命名空间。这样做的方法differ based on the XML library used。对于 MSXML,您需要在 DOMDocument 对象上添加 set the SelectionNamespaces property 以包含带有前缀的命名空间:

doc.setProperty("SelectionNamespaces", "xmlns:t='urn:omds20'")

然后更改您的查询以使用该前缀:

Set nodeList = doc.selectNodes("/t:OMDS/t:PAKET/t:PROVISION")

【讨论】:

  • 哇,非常感谢...真的让它工作了...谢谢!英雄!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2019-03-09
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多