Hi Everyone,

Thought I'd post a solution to a task I've been working on in the hope it will 
assist someone else with similar requirements. Thanks also to those who've 
previously posted on this as I found the following to be most helpful as well:
http://www.mail-archive.com/u2-users@listserver.u2ug.org/msg18895.html
https://gdoesu2.wordpress.com/tag/xdomlocate/
http://listserver.u2ug.org/pipermail/u2-users/2010-September/004713.html
http://www.mvdeveloper.com/kb/docs/kb10.pdf


I had to parse some xml returned via a soap request to an IIS server:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/";>
  <s:Body>
    <SuggestResponse xmlns="http://tempuri.org/";>
      <SuggestResult 
xmlns:a="http://schemas.datacontract.org/2004/07/FirstMac.Services.Category.Contracts";
 xmlns:i="http://www.w3.org/2001/XMLSchema-instance";>
        <a:CategoryGroup>Some group data</a:CategoryGroup>
        <a:CategoryName>Some name data</a:CategoryName>
      </SuggestResult>
    </SuggestResponse>
  </s:Body>
</s:Envelope>
There are only ever 2 value nodes returned if the soap query is successful with 
the SuggestResult node containing 'i:nil="true"' if the query is not successful.
e.g. <SuggestResult i:nil="true" ... />

The xml contains a default namespace and after much searching and trial and 
error I discovered I needed to use the following xpathString and nsMAP 
parameters in the XDOMLocate function:
Notes re the XDOMLocate function.
I found the UV11.1 Basic Commands Reference and Basic Extensions documents for 
XDOMLocate to be scarce on detail for the following:

  *   Each additional namespace in the string must also be space delimited.
  *   The double quotes enclosing the http url must be removed for each 
namespace defined in the nsMAP parameter. The description given has double 
quotes in the wrong places. e.g. if you have <s:Envelope 
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/";> then the namespace you 
need to specify is nsMAP = 'xmlns:s=http://schemas.xmlsoap.org/soap/envelope/'

<code>
xpathStr  = '/s:Envelope/s:Body'

nsMAP  = 'xmlns:s=http://schemas.xmlsoap.org/soap/envelope/ '
nsMAP := 
'xmlns:a=http://schemas.datacontract.org/2004/07/FirstMac.Services.Category.Contracts
 '
nsMAP := 'xmlns=http://tempuri.org/ '
nsMAP := 'xmlns:i=http://www.w3.org/2001/XMLSchema-instance'

OK = XDOMOpen( RespData, XML.FROM.STRING, hDOM )
if OK = XML.SUCCESS then
   crt 'XML document opened'
   OK = XDOMLocate( hDOM, xpathStr, nsMAP, hRoot )
   if OK = XML.SUCCESS then
      crt 'Found ':xpathStr

      OK = XDOMGetNodeName( hRoot, NodeName )
      crt 'Root node=':NodeName
      OK = XDOMLocateNode( hRoot, XDOM.CHILD, XDOM.FIRST.CHILD, 
XDOM.ELEMENT.NODE, hParent )
      if OK = XML.SUCCESS then
         OK = XDOMGetNodeName( hParent, NodeName )
         crt 'Parent node = ':NodeName                         ;* 
'SuggestResponse'
         OK = XDOMLocateNode( hParent, XDOM.CHILD, XDOM.FIRST.CHILD, 
XDOM.ELEMENT.NODE, hChild )
         if OK = XML.SUCCESS then
            OK = XDOMGetNodeName( hChild, NodeName )
            crt 'Child node = ':NodeName                       ;* 
'SuggestResult'
            OK = XDOMLocateNode( hChild, XDOM.CHILD, XDOM.FIRST.CHILD, 
XDOM.ELEMENT.NODE, hValueNode )
            if OK = XML.SUCCESS then
               OK = XDOMGetNodeName( hValueNode, NodeName )
               crt 'Value node1 = ':NodeName                   ;* 
'a:CategoryGroup'
               OK = XDOMLocateNode(hValueNode, XDOM.CHILD, XDOM.FIRST.CHILD, 
XDOM.TEXT.NODE, hTextNode )
               if OK = XML.SUCCESS then
                  OK = XDOMGetNodeValue(hTextNode, Value )
                  crt 'Payload1 = ':Value                      ;* 'Some group 
data'
               end else
                  gosub ShowError
               end
            end
            OK = XDOMLocateNode( hChild, XDOM.CHILD, 2, XDOM.ELEMENT.NODE, 
hValueNode )
            if OK = XML.SUCCESS then
               OK = XDOMGetNodeName( hValueNode, NodeName )
               crt 'Value node2 = ':NodeName                   ;* 
'a:CategoryName'
               OK = XDOMLocateNode(hValueNode, XDOM.CHILD, XDOM.FIRST.CHILD, 
XDOM.TEXT.NODE, hTextNode )
               if OK = XML.SUCCESS then
                  OK = XDOMGetNodeValue(hTextNode, Value )
                  crt 'Payload2 = ':Value                      ;* 'Some name 
data'
               end else
                  gosub ShowError
               end
            end else
               gosub ShowError
            end
         end else
            gosub ShowError
         end
      end else
         gosub ShowError
      end
   end
   OK = XDOMClose(hDOM)
end
return
*
ShowError:
OK = XMLGetError(Code, ErrText)
Crt "Code = ":Code
Crt "Text = ":ErrText
return
</code>

Program Output:
XML document opened
Found /s:Envelope/s:Body
Root node=s:Body
Parent node = SuggestResponse
Child node = SuggestResult
Value node1 = a:TagGroup
Payload1 = Household expenses
Value node2 = a:TagName
Payload2 = Telephone / mobile


A brief explanation of the above code snippet:

  1.  Open the xml document with XDOMOpen
  2.  Obtain a handle to the root node based on the specified xpathString and 
nsMAP parameters
  3.  Display the root node name
  4.  Obtain a handle to the parent node
  5.  Display the parent node name
  6.  Obtain a handle to the child node
  7.  Display the child node name
  8.  Obtain a handle to the 1st value node
  9.  display the 1st value node name
  10. Obtain a handle to the text node
  11. Display the 1st text data
  12. Obtain a handle to the 2nd (next) value node
  13. Display the 2nd value node name
  14. Obtain a handle to the 2nd text node
  15. Display the 2nd text data


Cheers
Peter






[Description: Description: 
https://www.firstmac.com.au]<https://webmail.firstmac.com.au/owa/redir.aspx?C=3TxBWxfLckGBVPoLiIA9bpVACaOTOtAI5wx873XG4iVimMG4ihRNvq2GjE8ncHzAUsu8CiQ8FdM.&URL=http%3a%2f%2fwww.firstmac.com.au%2f>

Peter Cheney

Universe Engineer

t 07 3017 8837 | f 07 3002 8400

e 
peter.che...@firstmac.com.au<https://webmail.firstmac.com.au/owa/redir.aspx?C=3TxBWxfLckGBVPoLiIA9bpVACaOTOtAI5wx873XG4iVimMG4ihRNvq2GjE8ncHzAUsu8CiQ8FdM.&URL=mailto%3apeter.cheney%40firstmac.com.au>
 | w 
www.firstmac.com.au<https://webmail.firstmac.com.au/owa/redir.aspx?C=3TxBWxfLckGBVPoLiIA9bpVACaOTOtAI5wx873XG4iVimMG4ihRNvq2GjE8ncHzAUsu8CiQ8FdM.&URL=https%3a%2f%2fwww.www.firstmac.com.au%2f>



 -------------------------------------------------------------------------------
Note: 
This email (inc all attachments) is for the use of the intended recipient(s) 
only.
Privileged or confidential information may be contained in this communication. 
If you have received this email in error, please notify the sender immediately 
and then delete all copies of this message from your computer network. If you 
are not the intended recipient, you must not keep, use, disclose, copy or 
distribute this email without the author's prior permission. If you are the 
intended recipient and you do not wish to receive similar electronic messages 
from us in future, then please respond to the sender to this effect. 
We have taken precautions to minimise the risk of transmitting software 
viruses, but advise you to carry out your own virus checks on this email and 
its attachments. We do not accept liability for any loss or damage caused by 
software viruses and do not represent that this transmission is free from 
viruses or other defects. 
Firstmac Limited (ABN 59 094 145 963) (AFSL 290600) 
 -------------------------------------------------------------------------------
_______________________________________________
U2-Users mailing list
U2-Users@listserver.u2ug.org
http://listserver.u2ug.org/mailman/listinfo/u2-users

Reply via email to