我正在尝试使用列表框的一列中的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
答案 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