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

时间:2014-05-20 09:17:09

标签: xml string vba nodes

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

所以,例如:

第一栏|第二栏

firstname |约翰

姓氏史密斯

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

我已经完成了第一部分,并在一列中列出了所有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

2 个答案:

答案 0 :(得分:0)

.AddItem xNode.nodeName & ""
.List(.ListCount-1, 1) = xNode.nodeValue & ""

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

答案 1 :(得分:0)

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

E.g。像这样:

.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

enter image description here