51Testing软件测试论坛

标题: 用QTP调用外部vbs读写XML的例子(一) [打印本页]

作者: songfun    时间: 2007-5-19 13:32
标题: 用QTP调用外部vbs读写XML的例子(一)
目前,企业中对XML的应用越来越广泛,作为自动化测试的测试工程师,也应该掌握XML的读写操作。
以下我使用XML DOM技术演示一个例子,用以读取XML指定节点的节点内容值。
读取函数原型 GetXml strXmlPath,nodeName
这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
首先,新建一个vbs文件(取个名字叫readXml.vbs),输入代码:

  1. '==================================================================
  2. '   Author  : songfun
  3. '
  4. '  Description :  Read XML
  5. '==================================================================
  6. Dim strXML

  7. GetXml "c:\search.xml","TestResult"  '这个函数的第一个参数表示xml文件所在路径,第二个参数表示希望获取到的xml节点名,请结合下列例子看
  8. MsgBox strXML


  9. Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
  10.         Dim xmlDoc,xmlRoot
  11.        
  12.         Set xmlDoc = CreateObject("Microsoft.XMLDOM") '创建XML DOM对象
  13.         xmlDoc.async = False  '控制加载模式为同步模式(xml树加载完毕后再执行后续代码)
  14.         xmlDoc.load strXmlFilePath        '载入xml文件
  15.         If xmlDoc.parseError.errorCode <> 0 Then
  16.                 MsgBox "XML文件格式不对,原因是:" & Chr(13) &  xmlDoc.parseError.reason
  17.                 Exit Function               
  18.         End If
  19.         Set xmlRoot = xmlDoc.documentElement       
  20.         xmlRecursion xmlRoot,xmlNodeName        '调用xml递归函数传入指定的根和节点名       
  21.         GetXml = True 'xmlRecursion (xmlRoot)
  22.        
  23. End Function

  24. Function xmlRecursion(byval xmlNode,byval strNodeName)
  25.         If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
  26.                 If  xmlNode.childNodes.item(0).nodeName = "#text" Then
  27.                         strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)                                               
  28.                 End If               
  29.         End If                       
  30.         If xmlNode.hasChildNodes Then
  31.                 For Each childNodeItem In xmlNode.ChildNodes
  32.                         If childNodeItem.hasChildNodes Then
  33.                                 xmlRecursion childNodeItem,strNodeName                               
  34.                         End If                       
  35.                 Next
  36.         End If       
  37. End Function

复制代码


接着,自己构造一个xml文件(取个名字叫search.xml),如:


  1. <?xml version="1.0" encoding="GB2312"?>

  2. <ROOT>
  3.         <TestCase>
  4.                 <TestNumberOne>1</TestNumberOne>
  5.                 <TestNumberTwo>2</TestNumberTwo>
  6.                 <TestNumberThree>+</TestNumberThree>
  7.                 <TestResult>3</TestResult>
  8.         </TestCase>
  9.         <TestCase>
  10.                 <TestNumberOne>3</TestNumberOne>
  11.                 <TestNumberTwo>2</TestNumberTwo>
  12.                 <TestNumberThree>-</TestNumberThree>
  13.                 <TestResult>1</TestResult>
  14.         </TestCase>
  15.         <TestCase>
  16.                 <TestNumberOne>3</TestNumberOne>
  17.                 <TestNumberTwo>7</TestNumberTwo>
  18.                 <TestNumberThree>*</TestNumberThree>
  19.                 <TestResult>21</TestResult>
  20.         </TestCase>
  21.         <TestCase>
  22.                 <TestNumberOne>2</TestNumberOne>
  23.                 <TestNumberTwo>5</TestNumberTwo>
  24.                 <TestNumberThree>/</TestNumberThree>
  25.                 <TestResult>0.4</TestResult>
  26.         </TestCase>       
  27. </ROOT>
复制代码


然后,在QTP的expert view中调用刚才写的vbs文件:
executefile "c:\readXml.vbs"

点“Run”,就能看到这个效果了。
当然,如果你不用调用外部文件的方式,也可以,如下图。

[ 本帖最后由 songfun 于 2007-5-19 13:46 编辑 ]
作者: dcyan    时间: 2007-5-19 14:35
两个if语句里怎么都有hasChildNodes, 没有看到判断hasChildNodes为false的情况会不会有问题啊
xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes
xmlNode.hasChildNodes
作者: walker1020    时间: 2007-5-19 15:43
谢谢楼主,是该研究一下 XML在QTP上的应用了
作者: songfun    时间: 2007-5-19 16:55
hasChildNodes 的目的是判断有没有子节点,如果有子节点要进行递归。这就是xml的遍历。
另一处的目的是判断有没有带文本。

原帖由 dcyan 于 2007-5-19 14:35 发表
两个if语句里怎么都有hasChildNodes, 没有看到判断hasChildNodes为false的情况会不会有问题啊
xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes
xmlNode.hasChildNodes

作者: alex_82712    时间: 2007-5-20 21:27
学习了
作者: bestmonty    时间: 2007-5-20 23:05
很有用的例子,学习了,谢谢!sdlkfj2
作者: yuedao    时间: 2007-5-21 10:23
sdlkfj8  怎么取属性名和属性值?
作者: 没有蛀牙    时间: 2007-5-22 16:33
最近自己也在研究XML,上次经楼主那个TravelXML的启发不少sdlkfj2
能问一下,这句是什么意思吗?
xmlNode.childNodes.item(0).nodeName = "#text"
作者: 没有蛀牙    时间: 2007-5-22 18:15
haschildnodes()这个方法好奇怪
明明已经没有子节点了,却仍然返回true
比如<TestResult>1</TestResult>这个节点
它的childNodes.item(0).nodeName竟然是“#text”
但是根据例子来看TestResult已经没有子节点了阿
作者: songfun    时间: 2007-5-22 21:27
因为在xml有一个特殊的“子节点”——文本节点。
比如 <TestResult>100</TestResult>

这个节点TestResult下并不是没有子节点,而是有一个文本节点,这个节点的nodeName就是“#text”,而nodeValue是100.
如果是 <TestResult/> 这种节点的话,那么用hasChildNodes则返回False。
不知道这样描述能理解么?



原帖由 没有蛀牙 于 2007-5-22 16:33 发表
最近自己也在研究XML,上次经楼主那个TravelXML的启发不少sdlkfj2
能问一下,这句是什么意思吗?
xmlNode.childNodes.item(0).nodeName = "#text"

作者: songfun    时间: 2007-5-22 21:31
顺便把以前我发过的关于操作xml的例子黏贴在这里:)

http://bbs.51testing.com/thread-74373-1-1.html

http://bbs.51testing.com/thread-76388-1-1.html

Option Explicit
Dim xmlStr

xmlLoad ("C:\aa.xml")

Sub xmlLoad (byval strPath)
        Dim xmlDoc,xmlRoot
        
        Set xmlDoc = CreateObject("Microsoft.XMLDOM")
        xmlDoc.async = False
        xmlDoc.load strPath
        If xmlDoc.parseError.errorCode <> 0 Then        
                MsgBox "XML loaded Failed.The reason is:" & xmlDoc.parseError.reason
                Exit Sub
        End If         
        Set xmlRoot = xmlDoc.documentElement
        xmlStr = xmlRoot.nodeName & ": " & xmlRoot.nodeValue
        If xmlRoot.childNodes.length <> 0 Then
                xmlRecursive xmlRoot
        End If        
        MsgBox xmlStr
End Sub

Sub xmlRecursive(byval xmlNode)
        Dim xmlChildNode,xmlChildNodeLen,iLen
        
        xmlChildNodeLen = xmlNode.childNodes.length        
        If xmlChildNodeLen = 0 Then Exit Sub        
        For iLen = 0 To xmlChildNodeLen - 1
                Set xmlChildNode = xmlNode.childNodes.item(iLen)
                xmlStr = xmlStr & Chr(13) & Chr(10) & xmlChildNode.nodeName & ": " & xmlChildNode.nodeValue
                If xmlChildNode.childNodes.length <> 0 Then
                        xmlRecursive xmlChildNode
                End If               
        Next        
End sub
作者: songfun    时间: 2007-5-22 21:32
'==========================================================================
' NAME: XMLread
'
' AUTHOR: songfun , 51Testing
' DATE  : 2007-4-28
'
' COMMENT:
'
'==========================================================================
Option Explicit

Dim xmlDoc,myErr,strXML

Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False   
xmlDoc.load "c:\calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then   
   Set myErr = xmlDoc.parseError
   MsgBox("XML Loads Failed. " & myErr.reason)
Else
        Set rootNode = xmlDoc.documentElement
        Call rTravel(rootNode)
        MsgBox strXML
End If


Sub rTravel (rNode)
        Dim blnTwo,intTestCase,
        blnTwo = False
        iLen = rNode.childNodes.length
        If iLen > 0 Then
                For i = 0 To rNode.childNodes.length -1
                        Set child = rNode.childNodes.item(i)
                        Call rTravel(child)                        
                        childtext = child.nodeValue                        
                        strXML = strXML & childtext & chr(13)
                Next
        Else
                Exit Sub               
        End If
End Sub
作者: milan330330    时间: 2007-5-23 10:20
谢谢楼主共享..学习了~
作者: ccc-51testing    时间: 2007-5-23 11:12
标题: 学习
要学的东西真多,累。。。
作者: dyq    时间: 2007-7-15 15:24
还没看,不过先支持一下。。。
作者: v_v    时间: 2007-8-6 01:56
哈哈,明天宋老大要讲的XML 读写。先看下了。。。sdlkfj5
作者: nedved1020    时间: 2007-8-27 15:32
讲的真不错!!学了不少!!体会中!!
作者: 看雪时节    时间: 2007-8-29 10:01
顶了
作者: 看雪时节    时间: 2007-8-29 10:01
斑竹辛苦
作者: lovetest6    时间: 2008-8-11 15:42
强帖留名啊。呵呵。
作者: zhaoping    时间: 2008-9-10 10:26

按照楼主这样做,弹出对话框:xml文件格式不对,原因是:不支持从当前编码到指定编码的切换

[ 本帖最后由 zhaoping 于 2008-9-10 10:28 编辑 ]
作者: TEST_HUAN    时间: 2008-11-20 10:02
写xml的呢?
作者: 302    时间: 2008-11-29 16:12
这个写的非常好 学习了 哈哈  支持了
作者: paulyang    时间: 2009-2-15 14:13

作者: kickgod    时间: 2009-4-27 22:47
留个名回来漫漫看
作者: lix43420    时间: 2009-12-12 12:40
精华帖,很有借鉴意义~~~
作者: yuwenit    时间: 2009-12-25 18:36
xml成数据交换的主流啦
作者: hukongli    时间: 2010-7-4 16:40
标题: xml标记修改
宋老师如何修改xml标记的值啊
如:<Cells L="DpCells">
            <Cell>FT Historian SE</Cell>
            <Cell>SOFTWARE\Rockwell Software\FTHistorian\last Version</Cell>
            <Cell />
            <Cell>2.20.00.0029</Cell>
          </Cells>
我要修改:<Cell>2.20.00.0029</Cell>用一个变量来代替2.20.00.0029
作者: thomy2010    时间: 2010-8-11 17:04
还没接触XML,学习了
作者: csj    时间: 2010-11-17 13:40
回复 1# songfun
问一下,我的这个语句有什么错误?
“root.childNodes(0).childNodes(10).item(3).nodeName”
运行说是不支持,请高手帮忙
作者: tony.dong    时间: 2010-11-23 11:04
请问高手,这个就是读的,取出来用是怎么实现的?
作者: oscarli    时间: 2011-1-6 13:56
学习了
作者: chris1984    时间: 2011-12-1 23:03
Mark!QTP读写XML,,,,,,学习无止境啊!

作者: andrewli    时间: 2012-1-12 09:28
学习了
作者: skducn    时间: 2012-8-3 10:57
学习了。
作者: kerryliyan    时间: 2013-5-28 15:14
非常不错!




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2