【问题标题】:How to convert XML node contents to string in VBA?如何将 XML 节点内容转换为 VBA 中的字符串?
【发布时间】:2014-07-08 11:20:47
【问题描述】:

我正在尝试在列表框的一列中使用 XML 文件中的所有 XML 节点填充列表框,然后在列表框的第二列中具有相应节点的值。

所以,例如:

第一栏 |第二栏

名字 |约翰

姓氏 |史密斯

(可怕的格式,但只是想给你一个粗略的想法)

我已经完成了第一部分,并在一列中列出了所有 XML 节点名称,但是我在后面部分遇到了困难。

这是我目前的代码:

Public Sub LoadDocument()
Dim xDoc As DOMDocument
Set xDoc = New DOMDocument
xDoc.validateOnParse = False
If xDoc.Load(filepath) Then

   DisplayNode xDoc.ChildNodes
Else
   ' The document failed to load.
   ' See the previous listing for error information.
End If
End Sub

Public Sub DisplayNode(ByRef Nodes As IXMLDOMNodeList)

   Dim xNode As IXMLDOMNode

   For Each xNode In Nodes
    If xNode.nodeName = "#text" Then

    Else
    With xnodeListBox
    .AddItem (xNode.nodeName)
    .list(.ListCount - 1, 1) = (xNode.nodevalue)
    End With
      If xNode.HasChildNodes Then
         DisplayNode xNode.ChildNodes
      End If
    End If
   Next xNode

End Sub

这一行是问题点:

.list(.ListCount - 1, 1) = (xNode.nodevalue)

谁能帮我解决这个问题?

编辑:

我相信我想通了。

认为发生的事情是这样的:第一个节点将包含文档的全部内容,因此它会有大量的字符。这意味着第一个节点的内容无法存储,并且使用前面的代码,不会移动到其他节点上。这可能只是特定于我正在处理的 XML 文件的限制。

为了防止这种情况发生,我将代码更改为:

   Public Sub DisplayNode(ByRef Nodes As IXMLDOMNodeList)

   Dim xNode As IXMLDOMNode

   For Each xNode In Nodes
    If xNode.nodeName = "#text" Then

    Else
    With xnodeListBox
    .AddItem xNode.nodeName
    If (Len(xNode.nodeTypedValue) < 300) Then
    .list(row, 1) = xNode.nodeTypedValue
    End If
    row = row + 1
    End With
    End If

      If xNode.HasChildNodes Then
         DisplayNode xNode.ChildNodes
      End If
   Next xNode

End Sub

【问题讨论】:

    标签: xml string vba nodes


    【解决方案1】:
    .AddItem xNode.nodeName & ""
    .List(.ListCount-1, 1) = xNode.nodeValue & ""
    

    添加空字符串以处理 Null 值。

    【讨论】:

    • 返回空值
    • Access、Excel 还是 Word?如果您添加“John;Smith”作为测试?
    • 我正在使用 Excel,并且正在做:.AddItem("John" &amp; ";" &amp; "Smith") 工作。
    • 好的,建议的解决方案仅适用于 Access。您的代码应该可以在 Excel 中运行,尽管我会丢弃大括号(请参阅修改后的代码)。错误信息是什么。
    • 我没有收到错误消息。使用我的原始代码,我的类型不匹配。使用您的代码,它将相同的输入放在列表框的两个部分中,而我需要将节点名称放在一列中,并将节点的值放在第二列中。
    【解决方案2】:

    使用 IsNull 函数检查值。 它返回一个布尔值,指示表达式是否不包含有效数据(Null)。

    例如像这样:

    .List(row, 1) = IIf(IsNull(xNode.NodeValue), "NULL", xNode.NodeValue)
    

    完整示例:

    Option Explicit
    
    Private Const xml As String = _
        "<ROOT>" & _
            "<NODE1>Val1</NODE1>" & _
            "<NODE2>Val2</NODE2>" & _
        "</ROOT>"
    
    Public Sub LoadDocument()
        Dim xDoc As DOMDocument
        Set xDoc = New DOMDocument
    
        xDoc.validateOnParse = False
    
        Dim row As Integer
        row = 0
    
        If xDoc.LoadXML(xml) Then
           DisplayNode xDoc.ChildNodes, row
        Else
           ' The document failed to load.
           ' See the previous listing for error information.
        End If
    End Sub
    
    Public Sub DisplayNode(ByRef Nodes As IXMLDOMNodeList, row As Integer)
    
        Dim xNode As IXMLDOMNode
    
        With xnodeListBox
            For Each xNode In Nodes
                If xNode.nodeName = "#text" Then
                    ' ...
                Else
                    .AddItem
                    .List(row, 0) = "nodeName:" & xNode.nodeName
                    .List(row, 1) = "nodeValue:" & IIf(IsNull(xNode.NodeValue), "NULL", xNode.NodeValue)
                    .List(row, 2) = "nodeTypedValue:" & IIf(IsNull(xNode.nodeTypedValue), "NULL", xNode.nodeTypedValue)
                    row = row + 1
    
                    If xNode.HasChildNodes Then
                        DisplayNode xNode.ChildNodes, row
                    End If
                End If
            Next xNode
       End With
    
    End Sub
    
    Private Sub CommandButton1_Click()
        LoadDocument
    End Sub
    
    Private Sub UserForm_Initialize()
        Me.xnodeListBox.ColumnCount = 3
    End Sub
    

    【讨论】:

    • 嗨,Dee,即使 xml 节点中有数据,我也会得到空值。令人困惑的是,当我将 xNode.nodeValue 分配给字符串 (xNodeContent) 并且 msgbox(xNodeContent) 显示节点的值时,它不为空。当我尝试在 .list 语句中使用字符串时,我得到了相同的类型不匹配错误?
    • 您可以发布您正在使用的 xml 数据的示例吗?
    猜你喜欢
    • 2011-08-28
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多