51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 21588|回复: 35
打印 上一主题 下一主题

[原创] 用QTP调用外部vbs读写XML的例子(一)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-5-19 13:32:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前,企业中对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 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-5-19 14:35:59 | 只看该作者
两个if语句里怎么都有hasChildNodes, 没有看到判断hasChildNodes为false的情况会不会有问题啊
xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes
xmlNode.hasChildNodes
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-2-27 08:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    3#
    发表于 2007-5-19 15:43:01 | 只看该作者
    谢谢楼主,是该研究一下 XML在QTP上的应用了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
     楼主| 发表于 2007-5-19 16:55:50 | 只看该作者
    hasChildNodes 的目的是判断有没有子节点,如果有子节点要进行递归。这就是xml的遍历。
    另一处的目的是判断有没有带文本。

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

    使用道具 举报

    该用户从未签到

    5#
    发表于 2007-5-20 21:27:50 | 只看该作者
    学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    6#
    发表于 2007-5-20 23:05:18 | 只看该作者
    很有用的例子,学习了,谢谢!sdlkfj2
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2007-5-21 10:23:59 | 只看该作者
    sdlkfj8  怎么取属性名和属性值?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2007-5-22 16:33:10 | 只看该作者
    最近自己也在研究XML,上次经楼主那个TravelXML的启发不少sdlkfj2
    能问一下,这句是什么意思吗?
    xmlNode.childNodes.item(0).nodeName = "#text"
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2007-5-22 18:15:45 | 只看该作者
    haschildnodes()这个方法好奇怪
    明明已经没有子节点了,却仍然返回true
    比如<TestResult>1</TestResult>这个节点
    它的childNodes.item(0).nodeName竟然是“#text”
    但是根据例子来看TestResult已经没有子节点了阿
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
     楼主| 发表于 2007-5-22 21:27:39 | 只看该作者
    因为在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"
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
     楼主| 发表于 2007-5-22 21:31:51 | 只看该作者
    顺便把以前我发过的关于操作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
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
     楼主| 发表于 2007-5-22 21:32:18 | 只看该作者
    '==========================================================================
    ' 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
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2007-5-23 10:20:18 | 只看该作者
    谢谢楼主共享..学习了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2007-5-23 11:12:58 | 只看该作者

    学习

    要学的东西真多,累。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2007-7-15 15:24:39 | 只看该作者
    还没看,不过先支持一下。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2007-8-6 01:56:50 | 只看该作者
    哈哈,明天宋老大要讲的XML 读写。先看下了。。。sdlkfj5
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
    发表于 2007-8-27 15:32:31 | 只看该作者
    讲的真不错!!学了不少!!体会中!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
    发表于 2007-8-29 10:01:31 | 只看该作者
    顶了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2007-8-29 10:01:50 | 只看该作者
    斑竹辛苦
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2008-8-11 15:42:10 | 只看该作者
    强帖留名啊。呵呵。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-23 01:24 , Processed in 0.096753 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表