3

我还没有做过任何 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->body->loginResponse->blah->blah...

但它并没有给我,它并没有真正给我任何回报,只是一个空的简单 xml 对象......

所以一个网站让我觉得我可能需要一个 XSLT 才能正确阅读。
或者别的什么让我觉得这是因为我没有在顶部。

帮助!

4

8 回答 8

2

SimpleXML 需要对命名空间 XML 进行特殊处理(参考

于 2010-05-05T21:42:39.860 回答
2

您可以使用 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 的工具和示例

于 2010-05-05T21:52:59.220 回答
1

伴侣,

命名空间通常要求您使用子项进行调用以返回命名空间元素。我会推荐使用像php soapclient 这样的soap 客户端,但因为我从来没有使用过它,所以还有另一种可能的选择。

$results = simplexml_load_string($data);
$xml = $results->children('http://schemas.xmlsoap.org/soap/envelope/');
var_dump($xml);

我相信这就是它的工作原理。

于 2010-12-02T02:48:20.330 回答
0

对于它的价值,您可能会发现使用PHP SoapClient来完成此任务会更轻松。O'Reilly 有一个关于 PHP SOAP的很好的教程。

于 2010-05-05T21:43:15.953 回答
0

还可以查看用于对 Salesforce.com 进行 SOAP 调用的PHP 工具包

于 2010-05-05T23:24:50.530 回答
0

我尝试按照salathe 的语法。但是children('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/

于 2013-11-16T16:23:44.250 回答
0

使用 SimpleXML 解析 soap 响应有一个多名称空间 XML 解析的精彩而简洁的示例。

对于任何想要从 UPS Rating 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);
}
于 2014-07-21T21:51:30.800 回答
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);
于 2016-09-17T12:54:14.330 回答