Я получаю XML-ответ от API следующим образом:
$response = <<<XML
<response uri="/crm/private/xml/Leads/insertRecords">
<result>
<message>Record(s) updated successfully</message>
<recorddetail>
<fl val="Id">1203498000000109001</fl>
<fl val="Created Time">2014-09-24 09:19:44</fl>
<fl val="Modified Time">2014-09-24 11:38:08</fl>
<fl val="Created By"><!--[CDATA[Brydges]]--></fl>
<fl val="Modified By"><!--[CDATA[Brydges]]--></fl>
</recorddetail>
</result>
</response>
XML;
Если я хочу сообщение, это кажется достаточно простым, используя
$xml_response = new SimpleXMLElement($response);
$message = $xml_response->result->message;
echo $message;
Тем не менее, я пытаюсь получить содержимое <fl val="id">
строка, например 1203498000000109001.
Я рассмотрел много вопросов о SO и попробовал все следующее, что предлагается, но безуспешно:
//using xpath with SimpleXMLElement
$xml_response = new SimpleXMLElement($response);
$zoho_id = $xml_response->xpath('/response/result/recorddetail/fl[@val="Id"]');
echo $zoho_id;
//using xpath with simplexml_load_string
$xml_response = new simplexml_load_string($response);
$zoho_id = $xml_response->xpath('/response/result/recorddetail/fl[@val="Id"]');
echo $zoho_id;
//using a foreach loop
$xml_response = new SimpleXMLElement($response);
foreach ($xml_response->result->recorddetail->fl as $fl) {
if ((string) $fl['val'] == 'Id') {
echo (string) $fl;
}
}
// using a foreach loop and then a switch case over the val attribute value to only echo Id
foreach ($xml_response->result->recorddetail->fl as $fl) {
switch((string) $fl['val']) { // Get attributes as element indices
case 'Id':
echo (string)$fl, ' is the Id';
break;
}
}
Любые предложения, как я могу получить контент, который мне нужен?
СЛЕДУЮЩИЕ ПРЕДЛОЖЕНИЯ ПРИЗРАКОВ:
print_r ($ doc) возвращает:
SimpleXMLElement Object (
[@attributes] => Array (
[uri] => /crm/private/xml/Leads/insertRecords
)
[result] => SimpleXMLElement Object (
[message] => Record(s) updated successfully
[recorddetail] => SimpleXMLElement Object (
[FL] => Array (
[0] => 1203498000000109001
[1] => 2014-09-24 09:19:44
[2] => 2014-09-24 13:06:37
[3] => SimpleXMLElement Object (
[@attributes] => Array (
[val] => Created By
)
)
[4] => SimpleXMLElement Object (
[@attributes] => Array (
[val] => Modified By
)
)
)
)
)
)
Первая часть xpath уже правильная, результаты xpath возвращают массив, поэтому относитесь к нему так:
$xml_response = new SimpleXMLElement($response);
$zoho_id = (string) $xml_response->xpath('/response/result/recorddetail/fl[@val="Id"]')[0];
// ^
echo $zoho_id;
// assuming you're expecting one result
Если у вас есть несколько узлов, то вы можете использовать цикл:
$zoho_id = $xml_response->xpath('/response/result/recorddetail/fl[@val="Id"]');
foreach($zoho_id as $node) {
$id = (string) $node;
echo $id;
}
Или же:
$xml_response = new SimpleXMLElement($response);
$recorddetail = $xml_response->xpath('/response/result/recorddetail');
foreach($recorddetail as $node) {
$id_node_val = (string) $node->FL[0];
echo $id_node_val;
}
Других решений пока нет …