如何使用vb获取xml中的动态节点和元素值?

问题描述 投票:1回答:1

我对vb很新。在我的XML文件中,所有属性,节点和元素都是动态的(Healthcare.xml)。我试图以下面的方式获取值。

页面:登录,方法:登录,args:ad59090,GA124444

在某些情况下,会有多种方法和参数。

页面:好处,方法:tagbenefits,args:benefit1,benefit2(此福利页面有多个方法)

页面:好处,方法:clickonEOC,args:没什么

XML code:

<?xml version="1.0" encoding="UTF-8"?>

<pages>

<page id="login">
<method name="login">
<step>I want to login to CCB application</step>
<args id="username">
<value>ad59090</value>
</args>
<args id="password">
<value>GA124444</value>
</args>
</method>
</page>

<page id="benefits">
<method name="tagbenefits">
<step>I want to tag benefits on benefit page</step>
<args id="benefit1">
<value>General benefits</value>
</args>
<args id="benefit2">
<value>Cancer</value>
</args>
</method>
<method name="cleabenefits">
<step>I want to clear tag benefits on benefit page</step>
<args id="benefit1">
<value>General benefits</value>
</args>
<args id="benefit2">
<value>Cancer</value>
</args>
</method>
<method name="clickonEOC">
<step>I want to click on EOC page</step>
</method>
</page>

<page id="claims">
<method name="tagclaims">
<step>I want to tag claims on claims page</step>
<args id="claim1">
<value>201234567899</value>
</args>
<args id="claim2">
<value>201234567897</value>
</args>
</method>
<method name="clickonclaimpaymentlink">
<step>I want to navigate to claims payment page</step>
<args id="claim">
<value>201234567825</value>
</args>
</method>
<method name="validateclaimnumber">
<step>I want to DCN number on claim payment detail page</step>
<args> 
<value>201234567897</value>
</args>
</method>
</page>

</pages>

我很震惊这样做。到目前为止,我已尝试使用3 for循环来获取值(Page - > Method - > args),但这不起作用。

第一个循环:获取页面节点数

第二个循环:尝试获取每个页面下的方法数量(但选择整个XML中的所有方法)

第三个循环:Gettig在特定方法Code is here下的参数数量

Vb代码:

Set Root = objXMLDoc.DocumentElement
Set NodeList = Root.getElementsByTagName("page")
Set List2 = xmlDoc.SelectNodes("//page")
Set List = xmlDoc.SelectNodes("//page/method") 'Here it is selecting all the methods in XML.
                                               'It should select the methods under page1

For Each node2 In List2
Set Pageid = node2.Attributes.getNamedItem("id")
MsgBox (Pageid.Text)


For Each node In List
Set methodname = node.Attributes.getNamedItem("name")
MsgBox (methodname.Text)


For Each Elem In NodeList
Set idlist = Elem.getElementsByTagName("value")

For j = 0 To idlist.Length - 1
Set arg = Elem.getElementsByTagName("value")(j)
Msg = Msg + "," + arg.Text & vbNewLine
Next
MsgBox (Msg)
Exit For

Next

Next

你能否提出一个实现这个目标的方法?

excel vba excel-vba
1个回答
0
投票

我找到了解决方案!

首先,使用多个循环来获取页面和方法。

接下来,获取参数的最终循环。下面是代码。

Sub Type2()
Dim xmlDoc As New DOMDocument
Dim Root
Dim NodeList
Dim Msg
Dim arg
Dim myStringArray() As String
Dim methodname
Dim finalmsg As String
xmlDoc.async = False
Dim node As IXMLDOMNode
Dim node2 As IXMLDOMNode
Dim i As Integer
Dim k As Integer
Dim L As Integer
L = 2
k = 1
i = 0

Set objXMLDoc = CreateObject("Microsoft.XMLDOM")
objXMLDoc.async = False

xmlDoc.Load ("C:\Users\Sifv\Desktop\XML\DummyXML.xml")
objXMLDoc.Load ("C:\Users\Sifv\Desktop\XML\DummyXML.xml")

'Getting the number of page and method nodes
Set Root = objXMLDoc.DocumentElement
Set NodeList = Root.getElementsByTagName("page")
Set NodeList2 = Root.getElementsByTagName("method")

'Three for loops to get pages and methods
For k = 0 To NodeList.Length

Set List2 = xmlDoc.SelectNodes("//page[" & k & "]")
Set List = xmlDoc.SelectNodes("//page[" & k & "]/method")

For Each node2 In List2
Set Pageid = node2.Attributes.getNamedItem("id")
'MsgBox (Pageid.Text)

For Each node In List
Set methodname = node.Attributes.getNamedItem("name")
'MsgBox (methodname.Text)

Worksheets("Sheet1").Activate
Cells(L, 1).Value = Pageid.Text
Cells(L, 2).Value = methodname.Text
L = L + 1
Next

Next

Next

'Final for loop to get the list of arguments under each method
L = 2
For Each Elem In NodeList2
Set idlist = Elem.getElementsByTagName("value")
'MsgBox (NodeList2.Length)
'MsgBox (idlist.Length)

For j = 0 To idlist.Length - 1
Set arg = Elem.getElementsByTagName("value")(j)
Msg = Msg + "," + arg.Text
Next j
'MsgBox (Msg)

If idlist.Length = 0 Then
Worksheets("Sheet1").Activate
Cells(L, 3).Value = "No Arguments"
L = L + 1

Else
Worksheets("Sheet1").Activate
Cells(L, 3).Value = "'" + Right(Msg, Len(Msg) - 1)
L = L + 1
End If

'MsgBox (Msg)
Msg = vbStringNull

Next


End Sub

下面是输出。

Excel output

© www.soinside.com 2019 - 2024. All rights reserved.