改写它。这是我的代码和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);
非常感谢你的帮助。
答案 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;
xmlns:a="http://example.net/xml-namespaces/Thingummy" xmlns:b="http://example.net/xml-namespaces/Grommet"
等属性;这些是实际的命名空间标识符,赢得更改。 xmlns:a
适用于以a:
开头的所有内容,依此类推;只是说xmlns=
是&#34;默认命名空间&#34;,对于没有<LoginCareGiverPortalResponse>
前缀的标签。
因此,如果您查找A
,B
以及当前示例中的默认值,您可以写下:
// 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;