Parsing XML file using php

偶尔善良 提交于 2020-01-06 15:26:28

问题


Rephrase it. Here's my code together with the XML. Everytime I try to print_r the response, It does not reflect anything.

$portal   = 'CaregiverPortal';
$userName = 'dxt3uyk27U3wRRrzaFGiwQ==';
$password = 'wD81PILmPuJX2fyFek937A==';
$url      = "https://webapp.healthcaresynergy.com:8002/demoalpha/CaregiverPortalMobile/CaregiverPortalS   ervice.svc?singleWsdl";         
$option   = array('trace' => 1 ); 

$xml      = '<soapenv:Envelope   xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">'.
           '<soapenv:Header/>'.
           '<soapenv:Body>'.
              '<LoginCaregiverPortal>'.
                 '<userName>Anything</userName>'.
                 '<password>Anything</password>'.
                 '<portal>'.$portal.'</portal>'.
                 '<caregiverID>'.$userName.'</caregiverID>'.
                 '<timeStamp>'.$password.'</timeStamp>'.
              '</LoginCaregiverPortal>'.
           '</soapenv:Body>'.
         '</soapenv:Envelope>';

$client = new LocalSoapClient($url, $option, $xml);

try 
{ 
 $client->LoginCaregiverPortal();
 $response = $client->__getLastResponse(); 
 //echo 'result';
 //echo "<br/>";
 //echo htmlspecialchars($response);
 $xml = simplexml_load_string($response);
 $json = json_encode($xml);
 $array = json_decode($json,TRUE);
 print_r($array);

}

this is what I get as a result.

Array ( )

I think This is where I'm getting an empty result.

 $xml = simplexml_load_string($response);
 $json = json_encode($xml);
 $array = json_decode($json,TRUE);
 print_r($array);

Many thanks for the help.


回答1:


While it is difficult to tell much, as you have not provided the code of LocalSoapClient that you have used in your program and there is not much known to me in terms of the requirements of healthcaresynergy.com.

However I see two probable errors. The two lines in your soap request should probably be:

'<userName>'.$userName.'</userName>'.
'<password>'.$password.'</password>'.



回答2:


Thanks for all the answers guys. It really helped me a lot to understand it.

However, I came up with a solution on nmy one which can and may help others as well if ever they encounter issues as such.

Here's what the try bracket in try catch was modified

  try 
{ 
 $client->LoginCaregiverPortal();
 $response = $client->__getLastResponse(); 
 //echo 'result';
 //echo "<br/>";
 //echo htmlspecialchars($response);
 $p        = xml_parser_create();
          xml_parse_into_struct($p, $response, $vals, $index);
          xml_parser_free($p);
          echo "Index array\n";
          echo('<pre>');
          print_r($index);
          echo('<pre/>');
          echo "\nVals array\n";
          print_r($vals);
     } 



回答3:


This JSON-encode-decode trick of turning the whole SimpleXML object into an array is entirely counter-productive, so firstly, drop that, and keep this bit:

 $client->LoginCaregiverPortal();
 $response = $client->__getLastResponse(); 
 $xml = simplexml_load_string($response);

What you now have in $xml is a SimpleXMLElement object. This has a lot of "magic" methods for letting you navigate through the XML, most of which are demonstrated on this page of the PHP manual.


Since this is a SOAP response, my guess is that the problem you're having is with "XML namespaces" - a tag name with a colon in, like <S:Envelope> is actually a tag called Envelope in the namespace with the local prefix of S. In SimpleXML, you have to "select" namespaces with ->children() and ->attributes().

You haven't shown the structure of the XML you got back, but assuming the sample in your other question is the result of running xml_parse_into_struct over it, it must look, in part, something like this:

<S:Envelope>
    <S:Body>
        <LoginCareGiverPortalResponse>
            <LoginCareGiverPortalResult>
                <A:Agencies>
                    <B:KeyValueOfIntHealthAgencyD9J3W_PIR>
                        <B:Value>
                        </B:Value>
                    </B:KeyValueOfIntHealthAgencyD9J3W_PIR>
                </A:Agencies>
                <A:Token>vy8BMS8nDIFdQWRTb6wyNDGGUMgBzHtOXU6mHqZgdxhRAbi0qkwluK9pjt03OQyf</A:Token>
            </LoginCareGiverPortalResult>
        </LoginCareGiverPortalResponse>
    </S:Body>
</S:Envelope>

To get the value of the A:Token tag (as mentioned on your other question), you would write this:

$token_element = $xml->children('S', true) // select the 'S' namespace
    ->Body                // $xml already points to <S:Envelope>
        ->children(null)  // select the namespace with no prefix
            ->LoginCareGiverPortalResponse
                 ->LoginCareGiverPortalResult
                     ->children('A', true) // select the 'A' namespace
                          Token;
// $token_element is an object pointing at that tag, we want its text content:
$token_text = (string)$token_element;

One caveat, though: the prefixes 'A' and 'B' have no universal meaning, and there is no guarantee that they won't get switched around in a different response. At the top of the response, you'll see attributes like xmlns:a="http://example.net/xml-namespaces/Thingummy" xmlns:b="http://example.net/xml-namespaces/Grommet"; those are the actual namespace identifiers, which won't change. xmlns:a is for everything beginning a:, and so on; the one just saying xmlns= is the "default namespace", for tags with no prefix like <LoginCareGiverPortalResponse>.

So if you look up what A, B, and the default are in your current example, you could write this:

// Define our own short-hands for the different namespaces
define('NS_SOAP', 'http://schemas.xmlsoap.org/soap/envelope/'); // This is standard
define('NS_RESPONSE', 'http://example.net/xml-namespaces/OurResponses');
define('NS_THINGUMMY', 'http://example.net/xml-namespaces/Thingummy');
define('NS_GROMMET', 'http://example.net/xml-namespaces/Grommet');

// Use them instead of the prefixes when selecting our namespaces
$token_element = $xml->children(NS_SOAP) // select the 'S' namespace
    ->Body                // $xml already points to <S:Envelope>
        ->children(NS_RESPONSE)  // select the "main" namespace
            ->LoginCareGiverPortalResponse
                 ->LoginCareGiverPortalResult
                     ->children(NS_THINGUMMY) // select the 'A' namespace
                          Token;


来源:https://stackoverflow.com/questions/24455900/parsing-xml-file-using-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!