使用php解析XML文件

时间:2014-06-27 15:47:40

标签: php xml parsing simplexml

改写它。这是我的代码和XML。每当我尝试print_r响应时,它都没有反映任何内容。

$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);

}

这就是我得到的结果。

Array ( )

我认为这是我得到一个空洞的结果。

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

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

虽然很难说清楚,但由于您没有提供您在程序中使用过的LocalSoapClient代码,而且我对Healthcaresynergy.com的要求并不了解。< / p>

但是我看到两个可能的错误。肥皂请求中的两行应该是:

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

答案 1 :(得分:0)

感谢所有答案的人。理解它真的帮了我很多。

然而,我想出了一个关于nmy的解决方案,如果他们遇到这样的问题,也可以帮助他人。

这里修改了try catch中的try括号

  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);
     } 

答案 2 :(得分:0)

将整个SimpleXML对象转换为数组的JSON-encode-decode技巧完全适得其反,首先,放弃它,并保持这一点:

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

您现在$xml中的内容是SimpleXMLElement object。这有很多&#34;魔法&#34;允许您浏览XML的方法,其中大多数是demonstrated on this page of the PHP manual


由于这是一个SOAP响应,我的猜测是你遇到的问题是&#34; XML命名空间&#34; - 带有冒号的标记名称,如<S:Envelope>,实际上是名称空间中名为Envelope的标记,其本地前缀为S。在SimpleXML中,您必须选择&#34;名称空间为->children()->attributes()

您还没有显示您获得的XML的结构,但假设the sample in your other question是对其运行xml_parse_into_struct的结果,它必须部分看起来像这样:

<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>

要获取A:Token标记的值(如您在其他问题中所述),您可以写下:

$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;

但是,有一点需要注意:前缀&#39; A&#39;和&#39; B&#39;没有普遍意义,并且无法保证他们不会在不同的回复中转换。在回复的顶部,您会看到xmlns:a="http://example.net/xml-namespaces/Thingummy" xmlns:b="http://example.net/xml-namespaces/Grommet"等属性;这些是实际的命名空间标识符,赢得更改。 xmlns:a适用于以a:开头的所有内容,依此类推;只是说xmlns=是&#34;默认命名空间&#34;,对于没有<LoginCareGiverPortalResponse>前缀的标签。

因此,如果您查找AB以及当前示例中的默认值,您可以写下:

// 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;