Iterate over XML Request Body, Scripted REST Service

thisisauniqueus
Giga Expert

Hi,

I have a scripted REST End Point which is getting the following XML content:

<?xml version="1.0" encoding="UTF-8"?> <company> <employee> <id>10</id> <firstname>Tom</firstname> <lastname>Cruise</lastname> <test>test1</test> <test>test3</test> </employee> <employee> <id>20</id> <firstname>Jennifer</firstname> <lastname>Aniston</lastname> <test>test11</test> <test>test33</test> </employee> </company>

i need to iterate over each "<employee>" node and insert/udpate the record in our instance. Can someone please provide help with the code im not very well versed with Glide XML Utils/Document.

P.S the REST service is in Global scope.

johnandersen please help

Regards,

JS

1 ACCEPTED SOLUTION

thisisauniqueus
Giga Expert

the issue was that calling `request.body.dataString` flushes it from the memory, i had something like



gs.log("[REST REQ] "+request.body.dataString);



var xmlDoc = new SMLDocument(request.body.dataString); //this was empty because i called request.body.dataString already once in the log statement



so i cached the `request.body.dataString` like




var req = request.body.dataString;



and the rest of the code kicked in just fine.



Thanks all for providing very useful information



Regards,


JS


View solution in original post

4 REPLIES 4

Chuck Tomasi
Tera Patron

Hi John,



These might be helpful.



Parsing XML Response


Parsing XML Document


Richard101
Mega Expert

John,



I would refer you to the XMLHelper documentation on the wiki. In the example code below xmlString would be the XML content you posted above.



var helper = new XMLHelper(xmlString);
var obj = helper.toObject();



Obj will be a regular Javascript object you can manipulate or iterate over as you wish



Links


XMLHelper


Ankur Bawiskar
Tera Patron
Tera Patron

Hi John,



Following links should be helpful:


http://wiki.servicenow.com/index.php?title=XMLDocument_Script_Object#gsc.tab=0


Parsing XML Document



Also below is the sample script which you can execute in background to parse all the values and insert into target table, which can be replicated at the place where you are getting the response.



Script:


var xmlString = '<?xml version="1.0" encoding="UTF-8"?> <company> <employee> <id>10</id> <firstname>Tom</firstname> <lastname>Cruise</lastname> <test>test1</test> <test>test3</test> </employee> <employee> <id>20</id> <firstname>Jennifer</firstname> <lastname>Aniston</lastname> <test>test11</test> <test>test33</test> </employee> </company>';



var xmldoc = new XMLDocument(xmlString);



var employeeLength = xmldoc.getNodes("/company/employee").getLength();



var tableGr = new GlideRecord('<tableName>'); // replace with your tableName



var idValue = xmldoc.getNodeText("/company/employee[1]/id");



for(var k=1; k<=employeeLength; k++){


// replace corresponding fields on left hand side of the script lines below to actual columns in that table


tableGr.initialize();


tableGr.<idField> = xmldoc.getNodeText("/company/employee["+k+"]/id");


tableGr.<firstnameField> = xmldoc.getNodeText("/company/employee["+k+"]/firstname");


tableGr.<lastnameField> = xmldoc.getNodeText("/company/employee["+k+"]/lastname");


tableGr.<testField> = xmldoc.getNodeText("/company/employee["+k+"]/test");


tableGr.insert();


}



Mark Correct if this solves your issue and also hit Like and Helpful if you find my response worthy based on the impact.


Thanks


Ankur


Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

thisisauniqueus
Giga Expert

the issue was that calling `request.body.dataString` flushes it from the memory, i had something like



gs.log("[REST REQ] "+request.body.dataString);



var xmlDoc = new SMLDocument(request.body.dataString); //this was empty because i called request.body.dataString already once in the log statement



so i cached the `request.body.dataString` like




var req = request.body.dataString;



and the rest of the code kicked in just fine.



Thanks all for providing very useful information



Regards,


JS