How to use the PBDOM object to build the XML content required for SOAP WebService and parse an XML document

Background

The purpose of this article is to show you how to use the PBDOM object to build the specified XML content for the parameter of an HTTP request sent with the HTTPClient object and how to obtain the specified content in the returned XML string.

Implementation Steps

1. Load the PBDOM Object in the PB Application

You can add pbdom170.pbd directly into your application (Default Path: C:\Program Files (x86)\Appeon\Shared\PowerBuilder) or import the PBDOM170.pbx file into a PBL in your application.

2. Use the PBDOM Object to Build the Specified XML String

Open the SOAP Web service on IE as shown below. Copy the associated SOAP sample request. Refer to the red content below. (If you don’t see this content, please contact your service provider to get such a sample request.)


The content of the XML string to be built:

<?xml version="1.0" encoding="utf-8"?> 
 <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
   <soap:Body> 
     <of_add xmlns="http://tempurl.org"> 
       <ai_test>short</ai_test> 
     </of_add> 
   </soap:Body> 
 </soap:Envelope>

If you want to simply use a string to build the XML content and send it through HTTPClient, the code is as follows:

 HttpClient    lhc_client 
 Integer    li_ret , i , li_StatusCode 
 String    ls_url , ls_data, ls_body , ls_ret 
 ls_url ="http://localhost/invoice/n_webservice.asmx"
 ls_body = '<?xml version="1.0" encoding="utf-8"?>'+& 
 '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '+& 
 'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+& 
 '  <soap:Body>'+& 
 '    <of_add xmlns="http://tempurl.org">'+& 
 '      <ai_test>2</ai_test>'+& 
 '    </of_add>'+& 
 '  </soap:Body>'+& 
 '</soap:Envelope>' 
 lhc_client = CREATE httpClient 
 lhc_client.SetRequestHeader("Content-Type", "text/xml") 
 lhc_client.sendrequest('POST',ls_url,ls_body) 
 li_StatusCode = lhc_client.GetResponseStatusCode() 
 ls_ret = lhc_client.GetResponseStatusText( ) 
 li_ret = lhc_client.getresponsebody(ls_data) 
 DESTROY lhc_client

If you use the PBDOM object to build the XML content, here's what it looks like:

 HttpClient    lhc_client 
 PBDOM_Builder   lpbdom_Builder 
 PBDOM_Document   lpbdom_doc 
 PBDOM_ProcessingInstruction   lpbdom_process 
 PBDOM_ELEMENT    lpbdom_root, lpbdom_body, lpbdom_method, lpbdom_arg 
 Integer    li_ret , i , li_StatusCode 
 String    ls_url, ls_data, ls_value, ls_body, ls_ret, ls_rootname 
 ls_url ="http://localhost/invoice/n_webservice.asmx"
 ls_rootname ="Envelope"
 TRY            lpbdom_doc = CREATE PBDOM_Document 
                lpbdom_doc.newdocument(ls_rootname) 
                lpbdom_process = CREATE PBDOM_ProcessingInstruction 
                lpbdom_process.setname("xml") 
                lpbdom_process.setvalue("version", "1.0") 
                lpbdom_process.setvalue("encoding", "utf-8")
                lpbdom_doc.addcontent(lpbdom_process) 
                DESTROY lpbdom_process 
                
                lpbdom_root = lpbdom_doc.getrootelement() 
                lpbdom_root.AddNameSpaceDeclaration('xsd',"http://www.w3.org/2001/XMLSchema") 
                lpbdom_root.SetNameSpace('xsd',"http://www.w3.org/2001/XMLSchema",False)
                lpbdom_root.AddNameSpaceDeclaration('xsi',"http://www.w3.org/2001/XMLSchema-instance") 
                lpbdom_root.SetNameSpace('xsi',"http://www.w3.org/2001/XMLSchema-instance",False) 
                lpbdom_root.AddNameSpaceDeclaration('soap',"http://schemas.xmlsoap.org/soap/envelope/") 
                lpbdom_root.SetNameSpace('soap',"http://schemas.xmlsoap.org/soap/envelope/",False) 
                //body  
                lpbdom_body = CREATE PBDOM_Element 
                lpbdom_body.setname( "Body") 
                lpbdom_body.setnamespace( "soap", "http://schemas.xmlsoap.org/soap/envelope/", False) 
                //of_add 
                lpbdom_method = CREATE PBDOM_Element 
                lpbdom_method.setname( "of_add") 
                lpbdom_method.addnamespacedeclaration( "", "http://tempurl.org") 
                //ai_test 
                lpbdom_arg = CREATE PBDOM_Element 
                lpbdom_arg.setname( "ai_test") 
                lpbdom_arg.settext( "2") 
                //addcontent 
                lpbdom_method.addcontent( lpbdom_arg) 
                lpbdom_body.addcontent( lpbdom_method) 
                lpbdom_root.addcontent( lpbdom_body) 
                ls_body  = lpbdom_doc.savedocumentintostring( )
                           //get new xml 
 CATCH ( PBDOM_Exception pbde )   
                MessageBox( "PBDOM Exception", pbde.getMessage() ) 
 CATCH ( PBXRuntimeError re )   
                MessageBox( "PBNI Exception", re.getMessage() ) 
 END TRY 
 IF isvalid(lpbdom_arg)
                   THEN     
DESTROY lpbdom_arg 
 IF isvalid(lpbdom_method)
            THEN     
DESTROY lpbdom_method 
 IF isvalid(lpbdom_body)
                THEN     
DESTROY lpbdom_body 
 IF isvalid(lpbdom_doc) 
                 THEN     
DESTROY lpbdom_doc 
                
 lhc_client = CREATE httpClient 
 lhc_client.SetRequestHeader("Content-Type", "text/xml") 
 lhc_client.sendrequest('POST',ls_url,ls_body) 
 li_StatusCode = lhc_client.GetResponseStatusCode() 
 ls_ret = lhc_client.GetResponseStatusText( ) 
 li_ret = lhc_client.getresponsebody(  ls_data) 
 DESTROY lhc_client

3. Use the PBDOM Object to Get the Specified Content in the XML String.

The content of the XML string to be obtained:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body> 
    <of_addResponse xmlns="http://tempurl.org"> 
      <of_addResult>short</of_addResult> 
    </of_addResponse> 
  </soap:Body> 
</soap:Envelope>

Execute the following PB code can get the value of the of_addResult element in the returned XML string from the Soap Web Service.

lpbdom_Builder = CREATE PBDOM_BUILDER 
 TRY 
                // generate XML Document 
                lpbdom_Doc = lpbdom_Builder.BuildFromString( ls_data )            
                ls_value = lpbdom_Doc.GetRootElement().& 
                GetChildElement("Body", "soap","http://schemas.xmlsoap.org/soap/envelope/").& 
                GetChildElement("of_addResponse","","http://tempurl.org").& 
                GetChildElement("of_addResult","","http://tempurl.org").gettext()          
 CATCH (PBDOM_Exception lpbdom_Except) 
                // Error Handling goes here, 
                MessageBox( "PBDOM_Exception", lpbdom_Except.GetExceptionCode()) 
 END TRY 
 DESTROY lpbdom_Builder