使用VBA获取XML中的所有属性和值

11 浏览
0 Comments

使用VBA获取XML中的所有属性和值

我正在使用VBA从XML父节点获取所有属性和值。

这是XML:


   
ABC
123ABC
IT A123

这是我在VBA中使用的代码:

sub test() 
    Dim XMLFile As Object
    Dim XMLFileName As String
    Set XMLFile = CreateObject("Microsoft.XMLDOM")
    XMLFileName = "C:\Users\Input.xml"
    XMLFile.async = False
    XMLFile.Load (XMLFileName)
    XMLFile.validateOnParse = False
    Dim mainnode As Object
    Dim node As Object
    Set mainnode = XMLFile.SelectNodes("//Elements")
    For Each node In mainnode
        Dim child As Variant
        For Each child In node.ChildNodes
            Debug.Print child.Name
        Next child
    Next node
End sub

这是我期望的输出结果。

Details
Name
Address
Dept
deptname
ID

我在执行上述代码时遇到错误。有人能帮我解决这个问题吗?谢谢!

0
0 Comments

问题的原因是在XML中只包含属性而没有标签时,代码无法获取节点。解决方法是修改代码,添加对属性的处理。

以下是XML中只包含属性而没有标签时的代码修改示例:

For Each node In mainnode
    Dim child As Object
    i = 0
    For Each child In node.ChildNodes
        Debug.Print child.BaseName
        Worksheets("sheet1").Range("C" & i + 1).Value = child.BaseName
        
        ' 处理属性
        If child.Attributes.Length > 0 Then
            Dim attr As Object
            For Each attr In child.Attributes
                Debug.Print attr.BaseName & " = " & attr.Text
                Worksheets("sheet1").Range("D" & i + 1).Value = attr.BaseName & " = " & attr.Text
                i = i + 1
            Next attr
        End If
        
        Dim kiddo As Object
        For Each kiddo In child.ChildNodes
            Debug.Print kiddo.BaseName
            Worksheets("sheet1").Range("D" & i + 1).Value = kiddo.BaseName
            i = i + 1
        Next kiddo
    Next child
Next node

在修改后的代码中,添加了对属性的处理部分。如果节点有属性,则遍历属性并打印出属性名和属性值。然后将属性名和属性值写入到Excel表格中。

修改后的代码可以正确获取XML中只包含属性而没有标签的节点。

0
0 Comments

在这个问题中,用户想要通过VBA获取XML中的所有属性和值。下面是用户提供的一些代码示例以及与问题相关的讨论。

问题的原因是用户在遍历XML节点时没有考虑到嵌套的子节点。用户最初的代码只能获取到"Details"和"Dept"这两个节点,而没有获取到"Name"和"Address"这两个节点。为了解决这个问题,用户需要在遍历子节点的循环中再添加一层循环,以获取嵌套的子节点。

解决方法是在遍历子节点的循环中添加一个内部循环,用于遍历嵌套的子节点。代码示例中的第二个代码块演示了如何实现这一点。通过添加内部循环,用户可以获取到"Details"和"Dept"节点的子节点"Name"和"Address"。

在讨论中,用户还提到了将属性写入Excel的问题。用户尝试使用"for"循环将属性写入Excel,但结果出现了错误。回答者建议用户查看相关的代码示例,并在新的问题中提供更多的信息和代码示例,以便获得更好的帮助。

此外,用户还提到了如何处理XML中重复的标签的问题。回答者建议用户使用VBA中的字典结构来处理这个问题。用户可以将标签添加到字典中,然后遍历字典的键来避免重复写入相同的标签。

最后,用户提到了如何获取XML中的属性的问题。回答者建议用户将这个问题作为一个独立的问题提出,并提供相关的代码和XML示例,以获得更好的帮助。

总结起来,这个问题的原因是用户没有考虑到XML中的嵌套子节点,在代码中没有添加相应的循环来获取这些子节点。解决方法是在遍历子节点的循环中添加内部循环来获取嵌套的子节点。在讨论中,还提到了处理属性和处理重复标签的方法。为了获得更好的帮助,用户被建议将相关问题作为独立的问题提出,并提供相关的代码和示例。

0