SoapUI中XML解析
From http://www.robert-nemet.com/2011/11/groovy-xml-parsing-in-soapui.html
Introduction
Since soapUI allows users to add Groovy scripts in large number of
places ( property expansions, setup /teardown scripts, listeners, test
step, etc... ) users can use any technology to reach to the goal. Lets
look at those which can make our life easier when it comes to XML
parsing.
soapUI XML Support
Old way would be soapUI way or using GroovyUtils from soapUI. Its goal is to simplify scripting and it can be instantiate from any Groovy script in soapUI, with:
where context is available in any Groovy script in soapUI. Lets look at GroovyUtils:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
| GroovyUtils Methods | |
|---|---|
expand(property) |
returns value of property, if there are property expansions they are expanded. |
extractErrorLineNumber(error) |
returns line number where error occurred |
|
getProjectPath()
|
returns path to project file |
|
getXml(node)
|
returns xml as a string from passed node |
getXmlHolder(xmlPropertyOrString) |
returns XmlHolder as a result of parsing passed Xml string |
registerJdbcDriver(driver) |
register JDBC driver for use in Groovy script |
setPropertyValue(testStep, property, value) |
sets a value for given test step property |
This time getXmlHolder is one that does what we need. Pars a given string as XML and returns object which we can use to manipulate with it.
| XmlHolder Methods | |
|---|---|
declareNamespace(prefix, uri) |
declare namespace prefix and URI |
getDomNode(xpath) |
returns a DOM node pointed by XPath expression |
getDomNodes(xpath) |
returns an array of DOM nodes pointed by XPath expression |
getNamespaces() |
returns a Map of namespaces |
getNodeValue(xpath) |
returns a value of node specified by XPath expression |
getNodeValues(xpath) |
returns an array of values specified by XPath expression |
getPrettyXml() |
returns a formatted XML |
getXml() |
returns a XML |
getXmlObject() |
returns a XmlBean Object |
| removeDomNodes(xpath) | removes a nodes specified by XPath expression |
setNodeValue(xpath, value) |
set a node value |
updateProperty() |
if a XmlHolder is created from test step property this updates that property |
updateProperty(prettyPrint)
|
if a XmlHolder is created from test step property this updates that property with well formatted XML |
Few Examples
Assume you have response:
For this examples I added a Properties Test Step with property response.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sim="http://www.example.org/SimpleSocialSOA/">
<soapenv:Header/>
<soapenv:Body>
<sim:LoginResponse>
<id>4456643453</id>
</sim:LoginResponse>
</soapenv:Body>
</soapenv:Envelope>
1. Parsing XML
According to that to get id from response you can do:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder("Properties#response")
log.info holder.getNodeValue("//id")
log.info holder['//id']
notice two ways to get node value with getNodeValue method and with [] operator. Difference is that getNodeValue will return first value that can be found with set XPath, while [] operator returns a array of values.
If you assume that response is like:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sim="http://www.example.org/SimpleSocialSOA/">
<soapenv:Header/>
<soapenv:Body>
<sim:LoginResponse>
<id>4456643453</id>
<id>4456643452</id>
<id>4456643451</id>
<id>4456643450</id>
</sim:LoginResponse>
</soapenv:Body>
</soapenv:Envelope>
Than this script:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder("Properties#response")
log.info holder.getNodeValue("//id")
for( node in holder['//id'] )
log.info node
will produce result like this:

2. Updating XML
Response as above and we do:
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder("Properties#response")
holder.setNodeValue("//id", "aaaaa")
for( node in holder['//id'] )
log.info node
def holder2 = groovyUtils.getXmlHolder("Properties#response")
holder2.getNodeValue("//id")
for( node in holder2['//id'] )
log.info node
Result is:

from this we can learn:
- if there are several nodes as result of XPath expression only first's node value will be changed with setNodeValue
- setting node value is not enough to update property value, we forgot to use updateProperty method
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder("Properties#response")
holder.setNodeValue("//id", "aaaaa")
for( node in holder['//id'] )
log.info node
holder.updateProperty()
def holder2 = groovyUtils.getXmlHolder("Properties#response")
holder2.getNodeValue("//id")
for( node in holder2['//id'] )
log.info node
Instead of using:
holder.setNodeValue("//id", "aaaaa")
you can use also:
holder["//id"] = "aaaaa"
And if XmlNode is created from property as in example above use updateProperty method to apply your changes to property or use GroovyUtils.setPropertyValue method.
Groovy XML
There are three classes built in Groovy for processing XML: XMLParser, XMLSlurper and DOMCategory. Best practice is to use XMLSlurper in
soapUI. Reason is that it have smallest memory footprint from all
three. I would no go in depths for those, you can read here XML processing.
This for example:
import groovy.xml.StreamingMarkupBuilder
def response = context.testCase.testSteps['Properties'].properties['response'].value
def responseXml = new XmlSlurper().parseText(response)
responseXml.breadthFirst().each {
def v = it.toString()
if ( it.name() == 'id')
it.replaceBody("$v XX")
}
appends " XX" to values of all id nodes.
Generally it is easier to use GroovyUtils but if you are familiar or invest some time in XmlSlurper you can get better results and more flexible scripts.
SoapUI中XML解析的更多相关文章
- 2016 - 1- 23 iOS中xml解析 (!!!!!!!有坑要解决!!!!!!)
一: iOS中xml解析的几种方式简介 1.官方原生 NSXMLParser :SAX方式解析,使用起来比较简单 2.第三方框架 libxml2 :纯C 同时支持DOM与SAX GDataXML: D ...
- Android中XML解析-Dom解析
Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...
- Android中XML解析-SAX解析
昨天由于时间比较匆忙只写了Android中的XML解析的Dom方式,这种方式比较方便,很容易理解,最大的不足就是内容多的时候,会消耗内存.SAX(Simple API for XML)是一个解析速度快 ...
- Android中XML解析-PULL解析
前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...
- Android中XML解析,保存的三种方法
简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...
- Android中XML解析
package com.example.thebroadproject; public class Book { private int id; private String name; privat ...
- xml解析----java中4中xml解析方法(转载)
转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与 ...
- cocos2d-x 中XML解析与数据存储
一不小心就玩了一周的游戏了.哎.玩的时候时间过得总是这么快... 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML,但这块是还有一个同事在做,所以不怎么熟悉), 看了 ...
- C# 将XML格式字符串,写入数据集的表中 XML解析
将XML格式字符串,写入数据集的表1中 命名空间:using System.Xml; string strRead;//strRead为以下xml值 ...
随机推荐
- .Net 内存池
最近在开发 Pinpoint .Net 客户端,和服务端通信都是通过 TCP 或者 UDP,需要处理大量的 Byte 数据,使用 .Net Framework 只能通过 new Byte[] 的方式申 ...
- 【MYSQL】解决Mysql直接登录问题(删除匿名用户)(转)
刚安装的Mysql会存在匿名用户. 在命令行下输入mysql,(如果这时提示不是外部或内部指令,那就把mysql server文件下的bin目录添加到系统路径Path中) 如果没有任何提示,直接进入& ...
- 基于脚本的modelsim自动化仿真笔记
这里记录一下基于脚本的modelsim自动化仿真的一些知识和模板,以后忘记了可以到这里查找.转载请标明出处:http://www.cnblogs.com/IClearner/ . 一.基本介绍 这里介 ...
- Nlpir Parser智能语义平台全文搜索
全文索引用于处理大文本集合,利用它人们可以在海量文本中快速获取需要的信息.全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统.一般来说,全文检索需要具备建立索引和提供查询的基本功能 ...
- Ubuntu虚拟机可以上网,可以ping网络,但是无法update和install,报连接不上服务器的错误解决方案:
http://askubuntu.com/questions/711889/err-apt-get-update-on-ubuntu-14-04即使给Ubuntu配置了代理,terminal能ping ...
- ES6新特性之生成器函数 (generator function): function*
一.什么是生成器函数(generator function)? 生成器函数是ES6的新特性之一,它是一个在执行时能中途暂时退出,后面重新调用又能重新进入继续执行的一种函数. 并且在函数内定义的变量的所 ...
- 已有 JFFs2文件系统的修改
项目应用中,对于前人留下的JFFS2的文件,有时候我们需要修改,但是苦于没有源文件,实际操作很多时候无所适从.每次支持生产之后再进行人为的升级.这样费时费力,也给生产人员增加了负担. 为了解决这个问题 ...
- Oracle外键需要建索引吗?
关于Oracle中的外键,首先要说明一下. 1. 除非已定义了父表主键或唯一键约束,否则oracle将不允许创建子表的外键约束. 2. 在定义外键约束时,oracle不会自动创建索引,所以必须手动在与 ...
- CSS3自定义滚动条样式
原文地址:→传送门 写在前面 滚动条是个很常见的东东,不过某些浏览器自带的滚动条确实不太好看啊,下面可以作为学习,探讨下自定义滚动条的实现,这样你的滚动条就可以美美的啦.但是,也只能玩玩,因为只针对w ...
- python--------------常用模块之正则
一.认识模块 什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.py文件 ...