我还没有做过任何xml项目,所以我不太清楚如何处理这些数据......
我正在使用curl向salesforce发出请求,他们给了我一个我需要解析的响应。我想使用simplexml。以下是回复的一部分:
<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://na6-api.salesforce.com/services/Soap/m/18.0/
</metadataServerUrl>
<passwordExpired>
false
</passwordExpired>
<sandbox>
false
</sandbox>
<serverUrl>
https://na6-api.salesforce.com/services/Soap/u/18.0/
</serverUrl>
<sessionId>
!AQ4AQLtDIqY.
</sessionId>
<userId>
</userId>
<userInfo>
<accessibilityMode>
false
</accessibilityMode>
<currencySymbol>
$
</currencySymbol>
<orgDefaultCurrencyIsoCode>
USD
</orgDefaultCurrencyIsoCode>
<orgDisallowHtmlAttachments>
false
</orgDisallowHtmlAttachments>
<orgHasPersonAccounts>
false
</orgHasPersonAccounts>
<organizationId>
</organizationId>
<organizationMultiCurrency>
false
</organizationMultiCurrency>
<organizationName>
Ox
</organizationName>
<profileId>
sdfgsdfg
</profileId>
<roleId>
sdfgsdfg
</roleId>
<userDefaultCurrencyIsoCode xsi:nil="true"/>
<userEmail>
###@gmail.com
</userEmail>
<userFullName>
### ###
</userFullName>
<userId>
asdfasdf
</userId>
<userLanguage>
en_US
</userLanguage>
<userLocale>
en_US
</userLocale>
<userName>
asdfasdf@gmail.com
</userName>
<userTimeZone>
America/Chicago
</userTimeZone>
<userType>
Standard
</userType>
<userUiSkin>
Theme3
</userUiSkin>
</userInfo>
</result>
</loginResponse>
</soapenv:Body>
</soapenv:Envelope>
无论如何,我希望将这些东西(我们称之为数据)提供给
$results = simplexml_load_string($data);
var_dump($results);
这会给我所有的数据...然后访问特定的部分,它将是$ results-&gt; body-&gt; loginResponse-&gt; blah-&gt; blah ...
但它没有给我这个,它并没有给我任何回报,只是一个空的简单xml对象...
所以有一个网站让我觉得我可能需要一个XSLT才能正确阅读 或者别的东西让我觉得这是因为我没有在顶部。
帮助!
答案 0 :(得分:2)
SimpleXML需要对命名空间XML(ref.)
进行特殊处理答案 1 :(得分:1)
您可以使用SimpleXML,但由于使用了命名空间(例如soapenv
),因此它不像简单那样。请考虑使用SimpleXMLElement::children
之类的:
$sxe = new SimpleXMLElement($data);
$login_response = $sxe->children('soapenv', TRUE)->Body->children('', TRUE)->loginResponse->result;
// Now that we have the <loginResponse> lets take a look at an item within it
echo $login_response->userInfo->userEmail;
最后,重要的是,您是否看过salesforce的tools & examples?
答案 2 :(得分:1)
伴侣,
名称空间通常要求您使用子进行调用以返回命名空间元素。我建议使用像soap soapclient这样的肥皂客户端,但因为我还没有使用它之前还有其他一种可能的选择。
$results = simplexml_load_string($data);
$xml = $results->children('http://schemas.xmlsoap.org/soap/envelope/');
var_dump($xml);
我相信它是如何运作的。
答案 3 :(得分:0)
对于它的价值,您可能会发现使用PHP SoapClient更轻松地完成此任务。 O'Reilly在PHP SOAP上有一个good tutorial。
答案 4 :(得分:0)
还要检查PHP Toolkit是否向Salesforce.com发送SOAP调用
答案 5 :(得分:0)
我尝试遵循salathe的语法。但孩子('soapenv',TRUE)对我不起作用,Jason的孩子('http://schemas.xmlsoap.org/soap/envelope/')工作。
因此,要在Salesforce Outbound Message中读取字段值CreatedDate,我需要以下代码:
$rcXML->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('http://soap.sforce.com/2005/09/outbound')->notifications->Notification->sObject->children('urn:sobject.enterprise.soap.sforce.com')->CreatedDate
为了帮助您了解它是如何工作的,我写了一篇包含相同代码和xml的帖子,这些帖子更容易理解。
http://amigotechnotes.wordpress.com/2013/11/16/parse-xml-with-namespace-by-simplexml-in-php/
答案 6 :(得分:0)
Parsing soap responses with SimpleXML有一个简洁明了的多命名空间XML解析示例。
对于想要从UPS评级API获取RateResponse的人,请按以下步骤操作:
// $client is your SoapClient object
$dom = new DOMDocument;
$dom->loadXML($client->__getLastResponse());
$xml = simplexml_load_string($dom->saveXML(), NULL, NULL, 'http://schemas.xmlsoap.org/soap/envelope/');
$RateResponse = $xml->xpath('/soapenv:Envelope/soapenv:Body')[0]->children('rate', true)->RateResponse;
foreach($RateResponse->RatedShipment as $RatedShipment) {
print_r((array)$RatedShipment);
}
答案 7 :(得分:0)
对于SAOP请求,我们可以使用短代码轻松解析,将SOAP-ENV:标记替换为空白
$response = '<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>';
$response = html_entity_decode($response);
$response = str_replace(['soapenv:', 'ns1:', ':ns1', 'SOAP-ENV:'], ['', '', '', ''], $response);
$objXmlData = simplexml_load_string($response);