Эхо XML значение дочернего узла на основе значения атрибута узла

Я получаю 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
)
)
)
)
)
)

2

Решение

Первая часть 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]