Jump to content

XML not parse with soap-env having custom tags in PHP


mohib_ayubi
Go to solution Solved by mohib_ayubi,

Recommended Posts

Dear Experts,

I need your help in the following:

I am experiencing an error while parsing my XML response in PHP

I have a below XML response, when i call from CURL request

<soap-env:Header>
    <eb:MessageHeader xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustUnderstand="1">
        <eb:From>
            <eb:PartyId eb:type="URI">Sabre_API</eb:PartyId>
        </eb:From>
        <eb:To>
            <eb:PartyId eb:type="URI">Agency</eb:PartyId>
        </eb:To>
        <eb:ConversationId>2021.01.DevStudio</eb:ConversationId>
        <eb:Service eb:type="sabreXML">Session</eb:Service>
        <eb:Action>TokenCreateRS</eb:Action>
        <eb:MessageData>
            <eb:MessageId>1913771794839350290</eb:MessageId>
            <eb:Timestamp>2023-02-23T22:04:43</eb:Timestamp>
        </eb:MessageData>
    </eb:MessageHeader>
    <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
        <wsse:BinarySecurityToken valueType="String" EncodingType="wsse:Base64Binary">T1RLAQLASo74A7olKG7QnepeFqs19UHX+0Cds9QiDZoYfu677xC3Vkr9a+OcQhutjPL4atVMAADQRtHIXdehGg/0OVuPdia/0cM233jFDvyJJHgJHC3o8gV2ssS63b4Y0lgCG59SiG4tmEcqAXcYAMlnq+wJ4TfsOIDFwYdP+D0peSEFBM/m3EyOUqc4idJ+vO4S7xENCeQ7UX4YVKjVLJs788omPDbSIRNo85KQ5QxRprldV0jucJpAtbNfs1DrMHFqNIPyg0CpVpgXILkFx0azkcAuvmbHMHLqqO13WJEOhsG0KDBhBhRn8CwoCgD9foXL24W6yGu8Ecm0Fzvb/MuAjuYm9s48yg**</wsse:BinarySecurityToken>
    </wsse:Security>
</soap-env:Header>
<soap-env:Body>
    <sws:TokenCreateRS xmlns:sws="http://webservices.sabre.com" Version="1.0.0">
        <sws:Success/>
    </sws:TokenCreateRS>
</soap-env:Body> </soap-env:Envelope>

To parse the above XML i have initially tried with the simplexml_load_String but it gives an empty response.

Then i tried DOM method by using following code, here considering $response->Data is the above XML.

    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;
    $dom->loadXML($response->Data);
    $dom->formatOutput = true;      
    $XMLContent = $dom->saveXML();

It gives me following output again:

<!--?xml version="1.0" encoding="UTF-8"?-->
<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">   <soap-env:header>
    <eb:messageheader xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustunderstand="1">
      <eb:from>
        <eb:partyid eb:type="URI">Sabre_API</eb:partyid>
      </eb:from>
      <eb:to>
        <eb:partyid eb:type="URI">Agency</eb:partyid>
      </eb:to>
      <eb:conversationid>2021.01.DevStudio</eb:conversationid>
      <eb:service eb:type="sabreXML">Session</eb:service>
      <eb:action>TokenCreateRS</eb:action>
      <eb:messagedata>
        <eb:messageid>1002038859236010450</eb:messageid>
        <eb:timestamp>2023-02-23T23:52:03</eb:timestamp>
      </eb:messagedata>
    </eb:messageheader>
    <wsse:security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
      <wsse:binarysecuritytoken valuetype="String" encodingtype="wsse:Base64Binary">T1RLAQJZqih4+TYQmYCcdj42lcej5nckNWdo6WNb8edNl3xNtxAkqmu2YKjKki1OKQ7B3HK3AADQCGiRWrlzFPM0KB4foAOsSF+I+5eXE32uQ23LLd+hOduY2BCJYqPw7CvwCJ/LfNjy3P+QyvClvu6ysctC3a0GjmixDPDqCIckcXPb+XDFyYhR5G5QzQjch/Eax25koLnNvfN8rlvjNq+ENJmaV17wP43GLo1pzd19d9HGMn1VgjrJiVGWAb1ezyeiFNAd1VuBD2lAmdlo4jvZJzAS/fklZvwNFbKME64YpaFRptoLz0FKmz47y1TVYFtV6TZxbKirP3PDms0aGlItbJ4apPSB2Q**</wsse:binarysecuritytoken>
    </wsse:security>   </soap-env:header>   <soap-env:body>
    <sws:tokencreaters xmlns:sws="http://webservices.sabre.com" version="1.0.0">
      <sws:success>
    </sws:success></sws:tokencreaters>   </soap-env:body> </soap-env:envelope>

So i plan to get data from NODE like below

Quote

$XMLContent->getElementsByTagName('soap-env:header')->item(0)->nodeValue);

But instead of giving me a node values it start giving me and error.

I just want to get the data in the node wsse:binarysecuritytoken

Did anyone experience some thing like this?

Can you please help me in that??

 

Tried also following, but got not helpful still

$domDocument = new DOMDocument();
$domDocument->loadXML($XMLContent);
$carriers=array();
$results=$domDocument->getElementsByTagName("wsse:Security");
foreach($results as $result)
{
    foreach($result->childNodes as $node)
    {
        if($node instanceof DOMElement)
        {
            array_push($carriers, $node->textContent);
        }
    }

}
var_dump($carriers);

 

Please Help

Link to comment
Share on other sites

Tried following but still it through empty error

 


			$xml = simplexml_load_String("$XMLContent", null, null, 'SOAP', true);	
			
			if(!$xml)
				trigger_error("Encoding Error!", E_USER_ERROR);
			
			$Results = $xml->children('SOAP',true);
			foreach($Results->children('SOAP',true) as $fault){
				if(strcmp($fault->getName(),'Fault') == 0){
					trigger_error("Error occurred request/response processing!", E_USER_ERROR);
				}
			}

 

Link to comment
Share on other sites

Tried following way i used to do also, but it also wont work.

 

   $dom = new DOMDocument;
        $dom->preserveWhiteSpace = false;
        $dom->loadXML($response->Data);
        $dom->formatOutput = true;        
        $XMLContent = $dom->saveXML();

        $xml = simplexml_load_String($XMLContent, null, null, 'soap-env', true);    

            if(!$xml)
                trigger_error("Encoding Error!", E_USER_ERROR);
            
            $Results = $xml->children('SOAP',true);
                
            foreach($Results->children('SOAP',true) as $fault){
                if(strcmp($fault->getName(),'Fault') == 0){
                    trigger_error("Error occurred request/response processing!", E_USER_ERROR);
                }
            }
            
            foreach($Results->children('soap-env',true) as $nodes){
                var_dump($nodes->getName());    
            }

    

Link to comment
Share on other sites

  • Solution

Ok finally after spent hours, i got that! I had to modify according to tag names as below, in the most parent i had to used soap-env instead of SOAP.

            $dom = new DOMDocument;
            $dom->preserveWhiteSpace = false;
            $dom->loadXML($response->Data);
            $dom->formatOutput = true;      
            $XMLContent = $dom->saveXML();

            $xml = simplexml_load_String($XMLContent, null, null, 'soap-env', true);    

            if(!$xml)
                trigger_error("Encoding Error!", E_USER_ERROR);
            
            $Results = $xml->children('soap-env',true);
                
            foreach($Results->children('soap-env',true) as $fault){
                if(strcmp($fault->getName(),'Fault') == 0){
                    trigger_error("Error occurred request/response processing!", E_USER_ERROR);
                }
            }
    
            foreach($Results->children('wsse',true) as $nodes){         
                if(strcmp($nodes->getName(),'Security') == 0){
                    foreach($nodes->children('wsse',true) as $securityNodes){
                        if(strcmp($securityNodes->getName(),'BinarySecurityToken') == 0){                           
                            $tokenParsed = (string)$securityNodes;                                                      
                        }
                    }
                }           
            }

 

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.