如何将 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" & ";" & "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 中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章