simplexml помогите как это разобрать? - PullRequest
3 голосов
/ 06 мая 2010

Я не делал ни одного 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 для правильного чтения.
Или что-то еще заставило меня думать, что это потому, что я не на вершине.

Помощь!

Ответы [ 8 ]

2 голосов
/ 06 мая 2010

SimpleXML требуется специальная обработка для пространства имен XML ( ref. )

1 голос
/ 02 декабря 2010

Mate

Пространства имен обычно требуют, чтобы вы сделали вызов, используя дочерние элементы, чтобы вернуть элементы пространства имен. Я бы порекомендовал использовать мыльный клиент, такой как php soapclient, но так как я никогда не использовал его, есть еще один возможный вариант.

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

Я верю, что так оно и есть.

1 голос
/ 06 мая 2010

Вы можете использовать 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 ?

0 голосов
/ 17 сентября 2016

Для запроса 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);
0 голосов
/ 22 июля 2014

Синтаксический анализ ответов мыла с помощью SimpleXML содержит блестящий и краткий пример анализа XML-пространства с несколькими именами.

Для тех, кто хочет получить RateResponse от UPS Rating API, вот как:

// $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);
}
0 голосов
/ 16 ноября 2013

Я пытаюсь следовать синтаксису salathe. Но дети ('soapenv', ИСТИНА) не работают для меня, Джейсон дети ('http://schemas.xmlsoap.org/soap/envelope/') работа.

Поэтому, чтобы прочитать значение поля CreatedDate в Salesforce Outbound Message, мне нужен следующий код:

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

0 голосов
/ 06 мая 2010

Также ознакомьтесь с PHP Toolkit для выполнения SOAP-вызовов на Salesforce.com

0 голосов
/ 06 мая 2010

Что бы это ни стоило, вам может оказаться, что вам проще всего использовать PHP SoapClient для этой задачи. У О'Рейли есть хороший учебник по PHP SOAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...