如何将 XML 节点内容转换为 VBA 中的字符串?

Posted

技术标签:

【中文标题】如何将 XML 节点内容转换为 VBA 中的字符串?【英文标题】:How to convert XML node contents to string in 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

【问题讨论】:

【参考方案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 数据的示例吗?

以上是关于如何将 XML 节点内容转换为 VBA 中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串 XML 片段转换为 Java 中的文档节点

XSLT:如何将 XML 节点转换为字符串

将 mmmdd,yyyy 字符串转换为日期 VBA

java将字符串转换为xml并解析节点[重复]

vba中如何将单元格内容强制转换为文本类型?

如何将具有 XML 格式内容的字符串转换为 JDom 文档