我非常擅长将XML表与PHP结合使用。我试图从通过SOAP调用返回给我的XML文件中提取数据。
我的XML正在返回。
评论了一些细节
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<loginResponse>
<result>
<metadataServerUrl>https://...-api.salesforce.com/service...</metadataServerUrl>
<passwordExpired>false</passwordExpired>
<sandbox>false</sandbox>
<serverUrl>https://...--api.salesforce.com/services/Soap/u/21.0/0...</serverUrl>
<sessionId>....</sessionId>
<userId>....</userId>
<userInfo>
<accessibilityMode>false</accessibilityMode>
<currencySymbol>€</currencySymbol> ... </userInfo>
</result>
</loginResponse>
</soapenv:Body>
</soapenv:Envelope>
所以我试图摆脱sessionID
// UP HERE SOAP CALL --- return data
.......
} else {
$response = curl_exec($soap_do);
curl_close($soap_do);
// print($response); <-- see result XML
// grabbing the sessionid
$xmlresponse = new SimpleXMLElement($response);
$test = $xmlresponse->result->sessionId['value'];
echo $test;
}
这会返回空白,但是当我开始添加LoginResponse和Soapenv(正文和信封)时,我得到一个错误,我正在尝试获得非对象的属性。我不确定我在这里做错了什么。
答案 0 :(得分:3)
使用SimpleXML,您可以使用SimpleXMLElement::children
通过XML命名空间(此处为soapenv
)查找子项。
对于你的情况,它会像
$xmlresponse = new SimpleXMLElement($response);
$response = $xmlresponse->children('soapenv', true)->Body->children('', true)->loginResponse->result->sessionId;
var_dump($response);
结果是
object(SimpleXMLElement)#4 (1) {
[0]=>
string(4) "...."
}
答案 1 :(得分:2)
我想说你应该使用SoapClient(http://php.net/manual/tr/class.soapclient.php)进行Soap Calls,但是如果你不想使用它,那么你可以解析这个XML:
$xmlresponse = new SimpleXMLElement(str_ireplace([':Envelope', ':Body'], '', $response));
$test = $xmlresponse->soapenv->loginResponse->result->sessionId['value'];
echo $test;