Hi there,
We are moving to use HTTPClient away from SOAP. as our version of PB is going out of support
I have an XML response which I am trying to interrogate so as to store the values into a result structure - named tns__DocResult
The structure has 3 columns:
global type tns__DocResult from structure
long Status
string StatusText
string Action
end type
I am loading the XML response (see below) into an oleobject - named lole
I am creating a list of nodes based on a documentElement in the lole
I should have 2 nodes - (DocResult) and when I test the length it returns 2 nodes.
The issue I am having is that when I loop through the nodes - it only ever loops over the same node twice. e.g PRINT
The statement - node = nodesList.nextNode() - does not seem to be working/moving onto the next node (EMAIL)
The tns__DocResult structure only ever contains one result - when it should contain 2
How do I fix this please? I am not familiar with the node syntax
Here is my function code:
public function tns__docresult of_parsexml_response ();
long ll_count, ll_index,ll_status,ll_ret
string ls_err, ls_Status
string ls_namespace, ls_status_text, ls_action
oleobject lole, node, nodesList
tns__docResult doc_result_list[]
// Define the XML string
string ls_xml
ls_xml = '<?xml version="1.0" encoding="utf-8"?>' + &
'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">' + &
'<soap:Body>' + &
'<DespatchDocumentResponse xmlns="http://lol.linz.govt.nz/">' + &
'<DespatchDocumentResult>' + &
'<DocResult>' + &
'<Status>1</Status>' + &
'<StatusText>No printer name given.</StatusText>' + &
'<Action>PRINT</Action>' + &
'</DocResult>' + &
'<DocResult>' + &
'<Status>1</Status>' + &
'<StatusText>Email sent OK</StatusText>' + &
'<Action>EMAIL</Action>' + &
'</DocResult>' + &
'</DespatchDocumentResult>' + &
'</DespatchDocumentResponse>' + &
'</soap:Body>' + &
'</soap:Envelope>'
gnv_app.of_createnvo( 'oleobject', lole )
lole.ConnectToNewObject("Msxml2.DOMDocument.6.0" )
lole.SetProperty("NewParser", TRUE)
lole.setProperty("SelectionNamespaces", "xmlns:lol='http://lol.linz.govt.nz/'")
if not lole.loadxml( ls_xml ) then throw gnv_app.of_createruntimeerror( FAILURE, 'Could not parse loadxml()')
if lole.parseError.errorCode <> 0 then throw gnv_app.of_createruntimeerror( lole.parseError.errorCode, lole.parseError.reason)
node = lole.documentElement
nodesList = node.selectNodes("//lol:DocResult")
// Loop through each DocResult element and extract data
ll_count = nodesList.length //returns 2
ll_index = 1
//Initialize the node to the first element
node = nodesList.nextNode()
// Loop through the nodes
do while not isNull(node))
ls_Status= node.selectSingleNode("//lol:Status").text
doc_result_list[ll_index].status =integer(ls_Status)
ls_status_text = node.selectSingleNode("//lol:StatusText").text
doc_result_list[ll_index].statustext = ls_status_text
ls_action = node.selectSingleNode("//lol:Action").text
doc_result_list[ll_index].action = ls_action
// Output the DocResult structure
messagebox("DocResult " + string(ll_index), "Status: " + string(doc_result_list[ll_index].status) + "~r~nStatusText: " +
doc_result_list[ll_index].statustext + "~r~nAction: " + doc_result_list[ll_index].action)
ll_index ++
// Move to the next node
node = nodesList.nextNode()
loop
return doc_result_list[] --- only ever returns one instead of two
end function