harsh sharma
harsh sharma

Reputation: 75

How to get the xml value using groovy

Sample XML:

<msgs>
    <msg>
        <type>sense</type>
        <cid>168</cid>
        <ip>192.168.140.150</ip>
        <errs/>
        <id>002EC0FEFF83EA97</id>
        <sensors>
            <sensor sid='002EC0FEFF8FFF27' desc='' batt='6.60' sig='-55' scount='0' rdate='15/05/2015 21:47:04' mdate='18/04/2016 08:06:25' />
            <sensor sid='002EC0FEFF8FFF27' desc='' batt='6.60' sig='-55' scount='0' rdate='15/05/2015 21:47:04' mdate='18/04/2016 08:07:25' />
            <sensor sid='002EC0FEFF8FFF27' desc='' batt='6.60' sig='-55' scount='0' rdate='15/05/2015 21:47:04' mdate='18/04/2016 08:08:25' />
        </sensors>
    </msg>
</msgs>

I tried this:

 def alert = com.eviware.soapui.support.UISupport;
    //Define a file pointer for groovy to handle the file operations.
    def inputFile = new File("C:\\Users\\Desktop\\New.xml")
    def XMLDATA  = new XmlParser().parse(inputFile)
    if(!inputFile.exists())
    {
        //Display an alert if the file is not found.
        alert.showInfoMessage("Input File 'New.xml' not found!");   
    }
    else
    {
        //Read and parse XML file and store it into a variable
        println "ATT1 = ${XMLDATA.attribute("type")}"
        println "ATT2 = ${XMLDATA.attribute("cid")}"
        println "ATT3 = ${XMLDATA.attribute("ip")}"
        println "ATT4 = ${XMLDATA.attribute("id")}"

        log.info 
        println "ATT5 = ${XMLDATA.attribute("sensors/sensor sid")}"

    XMLDATA.sensors.each{
    println it.text()
    } 

}

It is not display any result, it works for the single node but when the multiple attributes are there then it is not display any results

Upvotes: 0

Views: 5764

Answers (2)

Taras Kohut
Taras Kohut

Reputation: 2555

Try to do it this way:

    println "ATT1 = ${XMLDATA.msg.type[0].text()}"
    println "ATT2 = ${XMLDATA.msg.cid[0].text()}"
    println "ATT3 = ${XMLDATA.msg.ip[0].text()}"
    println "ATT4 = ${XMLDATA.msg.id[0].text()}"
    println XMLDATA.msg.sensors.sensor[0]['@sid'].flatten()
    println "ATT5 = ${XMLDATA.msg.sensors.sensor['@sid'].flatten()}"
    XMLDATA.msg.sensors.sensor.each{println it['@sid'].flatten()}

you can execute it here (Edit in console ->Execute script -> Output)

Upvotes: 1

tim_yates
tim_yates

Reputation: 171194

You just need to access the elements, not the crazy attributes thing..

Also, you check the file exists AFTER you parse it?

Renaming the XMLDATA variable to a more sensible xmlData, then this should work:

println "ATT1 = ${xmlData.msg.type.text()}"
println "ATT2 = ${xmlData.msg.cid.text()}"
println "ATT3 = ${xmlData.msg.ip.text()}"
println "ATT4 = ${xmlData.msg.id.text()}"

xmlData.msg.sensors.sensor.each {
    println "ATT5 = ${it.@sid}"
}

Upvotes: 0

Related Questions