如何使用VBA在Excel中读取XML属性?

3

这是我的代码...

   <?xml version="1.0" ?> 
   <DTS:Executable xmlns:DTS="www.microsoft.com/abc" DTS:ExecutableType="xyz">
       <DTS:Property DTS:Name="PackageFormatVersion">3</DTS:Property> 
       <DTS:Property DTS:Name="VersionComments" /> 
       <DTS:Property DTS:Name="CreatorName">FirstUser</DTS:Property> 
       <DTS:Property DTS:Name="CreatorComputerName">MySystem</DTS:Property>
   </DTS:Executable>

在这里,我可以使用 "abc.baseName" 读取元素,使用 "abc.Text" 读取其值。

它会给我以下结果:

属性 3 属性
属性 FirstUser

在这种情况下,我该如何读取 "PackageFormatVersion" 的值为3?也就是说,我知道某个值是3,但是我怎么知道那个值是什么呢?

我的意思是,我必须选择要读取哪个属性。

2个回答

8

要引用元素的文本属性,可以使用.Text属性或者.nodeTypeValue属性:

Sub TestXML()
Dim xmlDoc As Object 'Or enable reference to Microsoft XML 6.0 and use: MSXML2.DOMDocument
Dim elements As Object
Dim el As Variant
Dim xml$
xml = "<?xml version=""1.0"" ?>"
xml = xml & "<DTS:Executable xmlns:DTS=""www.microsoft.com/abc"" DTS:ExecutableType=""xyz"">"
xml = xml & "<DTS:Property DTS:Name=""PackageFormatVersion"">3</DTS:Property>"
xml = xml & "<DTS:Property DTS:Name=""VersionComments"" />"
xml = xml & "<DTS:Property DTS:Name=""CreatorName"">FirstUser</DTS:Property>"
xml = xml & "<DTS:Property DTS:Name=""CreatorComputerName"">MySystem</DTS:Property>"
xml = xml & "</DTS:Executable>"

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
'## Use the LoadXML method to load a known XML string
xmlDoc.LoadXML xml
'## OR use the Load method to load xml string from a file location:
'xmlDoc.Load "C:\my_xml_filename.xml"

'## Get the elements matching the tag:
Set elements = xmlDoc.getElementsByTagName("DTS:Property")
'## Iterate over the elements and print their Text property
For Each el In elements
    Debug.Print el.Text
    '## Alternatively:
    'Debug.Print el.nodeTypeValue
Next

End Sub

我知道某个值是3,但我怎么知道那个值是什么?

您可以在本地窗口中查看对象并检查其属性:

enter image description here

这里有一种替代方法,对我来说似乎比使用GetElementsByTagName更繁琐,但如果您需要遍历文档,则可以使用以下内容:

Sub TestXML2()
Dim xmlDoc As MSXML2.DOMDocument
Dim xmlNodes As MSXML2.IXMLDOMNodeList
Dim xNode As MSXML2.IXMLDOMNode
Dim cNode As MSXML2.IXMLDOMNode
Dim el As Variant
Dim xml$
xml = "<?xml version=""1.0"" ?>"
xml = xml & "<DTS:Executable xmlns:DTS=""www.microsoft.com/abc"" DTS:ExecutableType=""xyz"">"
xml = xml & "<DTS:Property DTS:Name=""PackageFormatVersion"">3</DTS:Property>"
xml = xml & "<DTS:Property DTS:Name=""VersionComments"" />"
xml = xml & "<DTS:Property DTS:Name=""CreatorName"">FirstUser</DTS:Property>"
xml = xml & "<DTS:Property DTS:Name=""CreatorComputerName"">MySystem</DTS:Property>"
xml = xml & "</DTS:Executable>"

Set xmlDoc = CreateObject("MSXML2.DOMDocument")
'## Use the LoadXML method to load a known XML string
xmlDoc.LoadXML xml
'## OR use the Load method to load xml string from a file location:
'xmlDoc.Load "C:\my_xml_filename.xml"

'## Get the elements matching the tag:
Set xmlNodes = xmlDoc.ChildNodes
'## Iterate over the elements and print their Text property
For Each xNode In xmlDoc.ChildNodes
    If xNode.NodeType = 1 Then  ' only look at type=NODE_ELEMENT
        For Each cNode In xNode.ChildNodes
            Debug.Print cNode.nodeTypedValue
            Debug.Print cNode.Text
        Next
    End If
Next

End Sub

只有一个疑问。实际上我的要求是,我不应该读取所有值(不是3,第一个用户,我的系统)。我只需要读取“CreatorName”作为FirstUser。有什么帮助吗? - sr1991
我已经编辑了你的第一段代码,如下所示: Sub TestXML() Dim Init As Integer Dim xmlDoc As MSXML2.DOMDocument Dim elements As Object Dim el As VariantInit = 5 Set xmlDoc = CreateObject("MSXML2.DOMDocument") xmlDoc.LoadXML ("C:\Users\Su\Documents\Saashu\Testing.xml") Set elements = xmlDoc.getElementsByTagName("DTS:Property") MsgBox "Hi" For Each el In elements MsgBox "Hello" ActiveSheet.Cells(Init, 3)=el.nodeTypeValue Init = Init + 1 Next End Sub但是它没有起作用。可能是什么问题呢? - sr1991
抱歉,我无法将其作为代码发布。上述代码已成功运行。但是它没有显示任何输出。为什么? - sr1991
LoadXML 方法接受一个字符串参数(完整的 XML 字符串)。如果你想从文档/路径中加载,需要使用 Load 方法:xmlDoc.Load "C:\Users\Su\Documents\Saashu\Testing.xml" - David Zemens

2
Sub TestXML()
Set Reference to Microsoft XML 6.0
Dim Init As Integer
Dim xmlDoc As MSXML2.DOMDocument
Dim elements As Object
Dim el As Variant
Dim Prop As String
Dim NumberOfElements As Integer
Dim n As IXMLDOMNode
Init = 5

Set xmlDoc = CreateObject("MSXML2.DOMDocument")

xmlDoc.Load ("C:\Users\Saashu\Testing.xml")

Set elements = xmlDoc.getElementsByTagName("DTS:Property")

Prop = xmlDoc.SelectSingleNode("//DTS:Property").Attributes.getNamedItem("DTS:Name").Text

NumberOfElements = xmlDoc.getElementsByTagName("DTS:Property").Length

For Each n In xmlDoc.SelectNodes("//DTS:Property")
   Prop = n.Attributes.getNamedItem("DTS:Name").Text
   Prop = Prop & " :: " & n.Text
   ActiveSheet.Cells(Init, 9).Value = Prop
   Init = Init + 1
Next
End Sub

这段代码还需要修改,因为我的要求是仅显示一些属性,比如CreatorName和CreatorComputerName,而不是全部属性。

感谢David在此问题上的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接