XML related API has been around for some time now in PeopleSoft and this post is not discussing anything new. Just something that I wanted to pen down for future reference.
So recently I have been working on a requirement where in I have to parse out a XML response and fetch data values in order to process them further. In this case the same tag element names repeat throughout the XML message and there are multiple levels in the message. The requirement was to traverse each "item" tag and fetch the value for "key" and "value" tags.
Format of the XML message is as shown below.
"1.0" encoding="UTF-8" xml version= <root> <level1> <level2> <level3> <item> <key>FieldName1</key> <value>Value1</value> <type>String</type> </item> <item> <key>FieldName2</key> <value>Value2</value> <type>Date</type> </item> <item> <key>FieldName3</key> <value>Value3</value> <type>Number</type> </item> </level3> </level2> </level1> </root>
Wrote two methods, first one is way longer than the second one.
For both methods I am passing the "field_name_value" and getting back the &fieldvalue value.
Method one - longer.
Local XmlDoc &NewHireXMLDoc;
Local XmlNode &root, &level1, &level2, &level3, &item;
Local number &z, &y, &x, &w, &v;
Local string &sResp, &fieldvalue;
Local boolean &bRet;
rem &sResp is the XML message in string form;
&NewHireXMLDoc = CreateXmlDoc();
&bRet = &NewHireXMLDoc.ParseXmlString(&sResp);
&rootNode = &NewHireXMLDoc.DocumentElement;
For &z = 1 To &rootNode.ChildNodeCount
If &root.GetChildNode(&z).NodeName = "level1" Then
&level1= &root.GetChildNode(&z);
For &y = 1 To &level1.ChildNodeCount
If &level1.GetChildNode(&y).NodeName = "level2" Then
&level2= &level1.GetChildNode(&y);
For &x = 1 To &level2.ChildNodeCount
If &level2.GetChildNode(&x).NodeName = "level3" Then
&level3 = &level2.GetChildNode(&x);
For &w = 1 To &level3.ChildNodeCount
If &level3.GetChildNode(&w).NodeName = "item" Then
&item = &level3.GetChildNode(&w);
For &v = 1 To &item.ChildNodeCount
If &item.GetChildNode(&v).NodeName = "key" And
&item.GetChildNode(&v).NodeValue = "field_name_value" Then
&fieldvalue = &item.GetChildNode(&v + 1).NodeValue;
&v = &v + 1;
End-If;
End-For;
End-If;
End-For;
End-If;
End-For;
End-If;
End-For;
End-If;
End-For;
Method two - shorter
Local XmlDoc &NewHireXMLDoc;
Local string &sResp, &fieldvalue;
Local boolean &bRet;
Local array of XmlNode &items;
Local number &y, &z;
rem &sResp is the XML message in string form;
&NewHireXMLDoc = CreateXmlDoc();
&bRet = &NewHireXMLDoc.ParseXmlString(&sResp);
&items = &NewHireXMLDoc.DocumentElement.FindNodes("level1/level2/level3/item");
For &z = 1 To &items.Len
For &y = 1 To &items [&z].ChildNodeCount
If &items [&z].GetChildNode(&y).NodeName = "key" And
&items [&z].GetChildNode(&y).NodeValue = "field_name_value" Then
&fieldvalue = &items [&z].GetChildNode(&y + 1).NodeValue;
Break;
End-If;
End-For;
End-For;
So recently I have been working on a requirement where in I have to parse out a XML response and fetch data values in order to process them further. In this case the same tag element names repeat throughout the XML message and there are multiple levels in the message. The requirement was to traverse each "item" tag and fetch the value for "key" and "value" tags.
Format of the XML message is as shown below.
"1.0" encoding="UTF-8" xml version= <root> <level1> <level2> <level3> <item> <key>FieldName1</key> <value>Value1</value> <type>String</type> </item> <item> <key>FieldName2</key> <value>Value2</value> <type>Date</type> </item> <item> <key>FieldName3</key> <value>Value3</value> <type>Number</type> </item> </level3> </level2> </level1> </root>
Wrote two methods, first one is way longer than the second one.
For both methods I am passing the "field_name_value" and getting back the &fieldvalue value.
Method one - longer.
Local XmlDoc &NewHireXMLDoc;
Local XmlNode &root, &level1, &level2, &level3, &item;
Local number &z, &y, &x, &w, &v;
Local string &sResp, &fieldvalue;
Local boolean &bRet;
rem &sResp is the XML message in string form;
&NewHireXMLDoc = CreateXmlDoc();
&bRet = &NewHireXMLDoc.ParseXmlString(&sResp);
&rootNode = &NewHireXMLDoc.DocumentElement;
For &z = 1 To &rootNode.ChildNodeCount
If &root.GetChildNode(&z).NodeName = "level1" Then
&level1= &root.GetChildNode(&z);
For &y = 1 To &level1.ChildNodeCount
If &level1.GetChildNode(&y).NodeName = "level2" Then
&level2= &level1.GetChildNode(&y);
For &x = 1 To &level2.ChildNodeCount
If &level2.GetChildNode(&x).NodeName = "level3" Then
&level3 = &level2.GetChildNode(&x);
For &w = 1 To &level3.ChildNodeCount
If &level3.GetChildNode(&w).NodeName = "item" Then
&item = &level3.GetChildNode(&w);
For &v = 1 To &item.ChildNodeCount
If &item.GetChildNode(&v).NodeName = "key" And
&item.GetChildNode(&v).NodeValue = "field_name_value" Then
&fieldvalue = &item.GetChildNode(&v + 1).NodeValue;
&v = &v + 1;
End-If;
End-For;
End-If;
End-For;
End-If;
End-For;
End-If;
End-For;
End-If;
End-For;
Method two - shorter
Local XmlDoc &NewHireXMLDoc;
Local string &sResp, &fieldvalue;
Local boolean &bRet;
Local array of XmlNode &items;
Local number &y, &z;
rem &sResp is the XML message in string form;
&NewHireXMLDoc = CreateXmlDoc();
&bRet = &NewHireXMLDoc.ParseXmlString(&sResp);
&items = &NewHireXMLDoc.DocumentElement.FindNodes("level1/level2/level3/item");
For &z = 1 To &items.Len
For &y = 1 To &items [&z].ChildNodeCount
If &items [&z].GetChildNode(&y).NodeName = "key" And
&items [&z].GetChildNode(&y).NodeValue = "field_name_value" Then
&fieldvalue = &items [&z].GetChildNode(&y + 1).NodeValue;
Break;
End-If;
End-For;
End-For;