Hi,
I want to read following xml file in katalon,
1). I need to count all report tags.
2). Read each R tags under report tag and its value.
Glad if anyone help on this.
I was able to get the report count using following code, but need to know any better way to do it. Also read R tags & its values.
def slurper = new XmlSlurper()
File f = new File(‘File path’)
def xml = slurper.parse(f)
def report = xml.depthFirst().findAll { it.name() == ‘reports’ }
Thanks.
XMLSlurper? For what it’s worth, you’re doing what I would do.
Thanks for reply. Do you know a way to read each R tags and its values.
hi,
regex will do that
could you share this xml as txt hard to cp text from image
hi,
ok this java code will do something
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class ReadXML {
public static void main(String argv[]) {
try {
File fXmlFile = new File("C:\\Users\\fitim\\IdeaProjects\\compareMaps\\src\\main\\java\\stuff.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("report");
List<String> r4 = new ArrayList<>();
List<String> r5 = new ArrayList<>();
List<String> r6 = new ArrayList<>();
List<String> r7 = new ArrayList<>();
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("R4 : " + eElement.getElementsByTagName("R4").item(0).getTextContent());
r4.add(eElement.getElementsByTagName("R4").item(0).getTextContent());
System.out.println("R5 : " + eElement.getElementsByTagName("R5").item(0).getTextContent());
r5.add(eElement.getElementsByTagName("R5").item(0).getTextContent());
System.out.println("R6 : " + eElement.getElementsByTagName("R6").item(0).getTextContent());
r6.add(eElement.getElementsByTagName("R6").item(0).getTextContent());
System.out.println("R7 : " + eElement.getElementsByTagName("R7").item(0).getTextContent());
r7.add(eElement.getElementsByTagName("R7").item(0).getTextContent());
}
}
int nodeR4 = 0;
System.out.println(r4);
for(String s : r4){
nodeR4 += Integer.valueOf(s);
}
System.out.println("NODE4 sum: "+nodeR4);
int nodeR5 = 0;
System.out.println(r5);
for(String s : r5){
nodeR5 += Integer.valueOf(s);
}
System.out.println("NODE5 sum: "+nodeR5);
int nodeR6 = 0;
System.out.println(r6);
for(String s : r6){
nodeR6 += Integer.valueOf(s);
}
System.out.println("NODE6 sum: "+nodeR6);
int nodeR7 = 0;
System.out.println(r7);
for(String s : r7){
nodeR7 += Integer.valueOf(s);
}
System.out.println("NODE7 sum: "+nodeR7);
int sum = nodeR4+nodeR5+nodeR6+nodeR7;
System.out.println("nodes SUM: "+sum);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Root element :transmission
Current Element :report
R4 : 3
R5 : 10
R6 : 14
R7 : 15
Current Element :report
R4 : 2
R5 : 4
R6 : 8
R7 : 19
Current Element :report
R4 : 5
R5 : 7
R6 : 4
R7 : 3
[3, 2, 5]
NODE4 sum: 10
[10, 4, 7]
NODE5 sum: 21
[14, 8, 4]
NODE6 sum: 26
[15, 19, 3]
NODE7 sum: 37
nodes SUM: 94
@thushar.ameen
I extended your code which uses XmlSlurper.
import java.nio.file.Path
import java.nio.file.Paths
import com.kms.katalon.core.configuration.RunConfiguration
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
Path file = Paths.get(RunConfiguration.getProjectDir())
.resolve("Include/features/transmissions.xml")
def slurper = new XmlSlurper()
def xml = slurper.parse(file.toFile())
def reportElementList = xml.depthFirst().findAll {
it.name() == 'report'
}
println "number of <report> element: " + reportElementList.size()
reportElementList.each { rp ->
println "R4: ${rp.R4}"
println "R5: ${rp.R5}"
println "R6: ${rp.R6}"
println "R7: ${rp.R7}"
println "R10: ${rp.R10}"
}
I got this output:
number of <report> element: 3
2020-03-21 20:25:33.188 DEBUG testcase.TC1 - 6: reportElementList.each({ java.lang.Object rp -> ... })
R4:
R5: 1930
R6: 3831
R7: Company Name
R10: Address
R4:
R5: 1930
R6: 3831
R7: Company Name
R10: Address
R4:
R5: 1930
R6: 3831
R7: Company Name
R10: Address
You can find a lot more of XmlSlurper usage at
1 Like
Hi,
do you need that is read as dynamic way, do not depend on is there value in R tag or is value digit or is value charts and count of R tags could be any (but count of R tags should be even in every node)
hello,
here is read as dynamic way
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.lang3.math.NumberUtils
import org.w3c.dom.*;
try {
String xmlFilePath = System.getProperty("user.dir")+"\\Include\\xmlFiles\\stuff.xml";
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFilePath);
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("report");
int cntNlist = nList.getLength();
int tagCounter = 0;
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(xmlFilePath);
List<String> tags = new ArrayList<>();
NodeList nodeList = document.getElementsByTagName("*");
//get count of R tag names in a node
int countReport = 0;
for(int i = 0; i < nodeList.getLength(); i++){
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("report")){
countReport++;
}
if (node.getNodeName().contains("R")){
tags.add(node.getNodeName());
tagCounter++;
}
if(countReport > 1){
break;
}
//System.out.println(node.getNodeName());
}
}
//dynamic list for tag values
HashMap<String,ArrayList<String>> maps1 = new HashMap<String, ArrayList<String>>();
String tag = tags.get(0);
String latest = tags.get(tags.size() - 1);
latest = latest.replace("R","");
int latestTag = Integer.parseInt(latest);
tag = tag.replace("R","");
int startTag = Integer.parseInt(tag);
for (int i = 0; i <= tagCounter-1; i++) {
maps1.put("r" + startTag, new ArrayList<>());
startTag++;
}
startTag = Integer.parseInt(tag);
//get R values from xml
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
//System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
for (int i = 0; i <= tagCounter-1; i++) {
maps1.get("r" + startTag).add(eElement.getElementsByTagName("R" + startTag).item(0).getTextContent());
startTag++;
if (startTag >= latestTag + 1) {
startTag = Integer.parseInt(tag);
}
}
}
}
startTag = Integer.parseInt(tag);
//TODO print out and calculate
HashMap<Integer,ArrayList<Integer>> maps2 = new HashMap<Integer, ArrayList<Integer>>();
for (int i = 0; i <= tagCounter-1; i++){
maps2.put(startTag, new ArrayList<>());
startTag++;
}
//add maps1 values to maps2 as integer
startTag = Integer.parseInt(tag);
//String val = maps1.get("r"+startTag).get(0);
for (int i = 0; i < nList.getLength(); i++){
for (int j = 0; j <= tagCounter-1; j++) {
boolean digits = NumberUtils.isDigits(maps1.get("r" + startTag).get(i));
if (maps1.get("r"+startTag).get(i).equals("") || digits == false){
maps2.get(startTag).add(0);
//maps2.get(startTag).add(Integer.parseInt(maps1.get("r" + startTag).get(0)));
}
else{
maps2.get(startTag).add(Integer.parseInt(maps1.get("r" + startTag).get(i)));
}
startTag++;
if (startTag >= latestTag + 1) {
startTag = Integer.parseInt(tag);
}
}
}
startTag = Integer.parseInt(tag);
System.out.println("Node values");
int sumCounter = 1;
int nodesSum = 0;
int getCounter = 0;
int tempSum = 0;
for (int i = 0; i < nList.getLength(); i++) {
for (int j = 0; j <= tagCounter-1; j++) {
if (maps2.get(startTag).get(i) != 0) {
nodesSum += maps2.get(startTag).get(i);
tempSum += maps2.get(startTag).get(i);
}
else{
nodesSum += 0;
tempSum += 0;
System.out.println("node R"+startTag+ " value: "+maps1.get("r"+startTag).get(getCounter));
}
//System.out.println("node R"+startTag+ " sum: "+nodesSum);
System.out.println("node R"+startTag+ " value: "+maps2.get(startTag).get(getCounter));
//System.out.println("node R"+startTag+ " value: "+maps1.get(startTag).get(0));
if (sumCounter % tagCounter == 0){
System.out.println("nodes sum: "+nodesSum);
getCounter++;
nodesSum = 0;
}
startTag++;
if (startTag >= latestTag + 1) {
startTag = Integer.parseInt(tag);
}
sumCounter++;
}
}
System.out.println("R Node sum values: "+tempSum);
} catch (Exception e) {
e.printStackTrace();
}
node R4 value: cat4
node R4 value: 0
node R5 value: 2
node R6 value: 3
node R7 value: 4
node R8 value: 5
node R9 value:
node R9 value: 0
nodes sum: 14
node R4 value: 1
node R5 value: 2
node R7 value: 4
node R8 value: 5
node R9 value:
node R9 value: 0
nodes sum: 15
node R4 value: 1
node R5 value: dog
node R5 value: 0
node R6 value: 3
node R7 value: 4
node R8 value: 5
node R9 value: 6
nodes sum: 19
R Node sum values: 48
Hi Timo, I want to read R tags under every report element dynamically.Not hard coded. R tags can be dynamic in every run. I don’t know what is there in the next run. In VB I used it as below,
Dim status,var_OutboundClaimNumber
Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.load(XML file path))
Set ElemList = xmlDoc.getElementsByTagName("report")
counter = ElemList.length
For r = 0 To counter-1 Step 1
var_OutboundClaimNumber = ElemList.item(r).selectSingleNode("R15").text
Set ChildNodes = ElemList.item(r).childNodes
totalNodeCount = ChildNodes.length
ReDim arrayOfOutboundXML(totalNodeCount,2)
InboundXMLFileValidation
Next
hi,
test data was
<?xml version="1.0"?>
<transmission>
<reports>
<report>
<R4>cat4</R4>
<R5>2</R5>
<R6>3</R6>
<R7>4</R7>
<R8>5</R8>
<R9></R9>
</report>
<report>
<R4>1</R4>
<R5>2</R5>
<R6>3</R6>
<R7>4</R7>
<R8>5</R8>
<R9></R9>
</report>
<report>
<R4>1</R4>
<R5>dog</R5>
<R6>3</R6>
<R7>4</R7>
<R8>5</R8>
<R9>6</R9>
</report>
</reports>
</transmission>
@kazurayam, Thanks for your reply. Really appreciated. I was going through the url you gave me to find reading R tags dynamically rather than hard coded. But still no luck.