【问题标题】:Import XML data into excel using VBA, selectnodes is not working (returns nothing)使用 VBA 将 XML 数据导入 excel,selectnodes 不起作用(不返回任何内容)
【发布时间】:2016-06-24 14:40:57
【问题描述】:

我有以下 XML

<cqresponse xmlns="http://ibm.com/rational/cqweb/v7.1">
<rows>
    <row>
        <id>
            <![CDATA[ ABC00082474 ]]>
        </id>
        <Short_Desc>
            <![CDATA[
            Some Description 1
            ]]>
        </Short_Desc>
        <State>
            <![CDATA[ Some State 1 ]]>
        </State>
     </row>
     <row>
        <id>
            <![CDATA[ ABC00082475 ]]>
        </id>
        <Short_Desc>
            <![CDATA[
            Some Description 2
            ]]>
        </Short_Desc>
        <State>
            <![CDATA[ Some State 2 ]]>
        </State>
    </row>
</rows>
</cqresponse>

我想使用 VB 脚本将其导入 Excel。我有以下代码,但 SelectNodes 没有返回任何内容。它只是返回 Nothing

Sub Test()
    Dim nodeList As IXMLDOMNodeList
    Dim nodeRow As IXMLDOMNode
    Dim nodeCell As IXMLDOMNode
    Dim rowCount As Integer
    Dim cellCount As Integer
    Dim rowRange As Range
    Dim cellRange As Range
    Dim sheet As Worksheet
    Dim xpathToExtractRow As String
    Dim dom As DOMDocument60

    xpathToExtractRow = "/cqresponse/rows/row"

    Set dom = New DOMDocument60
    dom.Load ("C:\ABC.xml") ' this file contains the same xml data as mentioned above
    Set sheet = ActiveSheet
    Set nodeList = dom.SelectNodes(xpathToExtractRow)

    rowCount = 0
    For Each nodeRow In nodeList
        rowCount = rowCount + 1
        cellCount = 0
        For Each nodeCell In nodeRow.ChildNodes
            cellCount = cellCount + 1
            Set cellRange = sheet.Cells(rowCount, cellCount)
            cellRange.Value = nodeCell.Text
        Next nodeCell
    Next nodeRow
End Sub

这有什么问题还是我需要采取不同的方法?

【问题讨论】:

  • 是 VBA 还是 VB.NET,这是两种截然不同的语言。
  • 我的意思是VBA,不知道为什么它有时会在主题中显示vb.net
  • 这是因为它被标记为这样。其他人编辑了您的帖子以将其删除。

标签: xml vba excel


【解决方案1】:

XML 解析经常犯的一个错误是根中未声明的命名空间。因此,您必须在文档解析期间分配命名空间前缀,并在 XPath 表达式中使用这样的前缀。下面,分配了doc

...
Dim xpathToExtractRow As String, XMLNamespaces As String
Dim dom As DOMDocument60

xpathToExtractRow = "/doc:cqresponse/doc:rows/doc:row"
XMLNamespaces = "xmlns:doc='http://ibm.com/rational/cqweb/v7.1'"

Set dom = New DOMDocument60
dom.Load ("C:\ABC.xml")
dom.setProperty "SelectionNamespaces", XMLNamespaces
...

【讨论】:

  • 太棒了!非常感谢您的快速回复。我无法立即对其进行测试,但现在我进行了测试并且效果很好。
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多