使用VBA获取XML中的所有属性和值
使用VBA获取XML中的所有属性和值
我正在使用VBA从XML父节点获取所有属性和值。
这是XML:
ABC 123ABCIT 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
我在执行上述代码时遇到错误。有人能帮我解决这个问题吗?谢谢!
问题的原因是在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中只包含属性而没有标签的节点。
在这个问题中,用户想要通过VBA获取XML中的所有属性和值。下面是用户提供的一些代码示例以及与问题相关的讨论。
问题的原因是用户在遍历XML节点时没有考虑到嵌套的子节点。用户最初的代码只能获取到"Details"和"Dept"这两个节点,而没有获取到"Name"和"Address"这两个节点。为了解决这个问题,用户需要在遍历子节点的循环中再添加一层循环,以获取嵌套的子节点。
解决方法是在遍历子节点的循环中添加一个内部循环,用于遍历嵌套的子节点。代码示例中的第二个代码块演示了如何实现这一点。通过添加内部循环,用户可以获取到"Details"和"Dept"节点的子节点"Name"和"Address"。
在讨论中,用户还提到了将属性写入Excel的问题。用户尝试使用"for"循环将属性写入Excel,但结果出现了错误。回答者建议用户查看相关的代码示例,并在新的问题中提供更多的信息和代码示例,以便获得更好的帮助。
此外,用户还提到了如何处理XML中重复的标签的问题。回答者建议用户使用VBA中的字典结构来处理这个问题。用户可以将标签添加到字典中,然后遍历字典的键来避免重复写入相同的标签。
最后,用户提到了如何获取XML中的属性的问题。回答者建议用户将这个问题作为一个独立的问题提出,并提供相关的代码和XML示例,以获得更好的帮助。
总结起来,这个问题的原因是用户没有考虑到XML中的嵌套子节点,在代码中没有添加相应的循环来获取这些子节点。解决方法是在遍历子节点的循环中添加内部循环来获取嵌套的子节点。在讨论中,还提到了处理属性和处理重复标签的方法。为了获得更好的帮助,用户被建议将相关问题作为独立的问题提出,并提供相关的代码和示例。