2014-09-24 10 views
2

я получаю ответ XML от API следующим образом:Echo значение узла XML ребенка на основе значения атрибута узла

$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; 
    } 
} 

Любые предложения, как я могу восстановить содержание я требую?

СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ Призраки'S:

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 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

ответ

0

Первая 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

Спасибо Дух. Однако первый пример разбивает весь скрипт (кажется, что он должен делать с [0] в конце в соответствии с проверкой Dreamweaver, а второй не работает ни боюсь. Кроме того, если я удалю [0] из первый пример, а затем попробуйте следующее. Я получаю неожиданные результаты: '$ xml_response = new SimpleXMLElement ($ response); $ zoho_id = (string) $ xml_response-> xpath ('/response/result/recorddetail/fl [@val = «Id»] '); var_dump ($ zoho_id);' – JBReading

+0

@JBЧтобы на основании вашего примера, это был рабочий, здесь [ознакомьтесь с демонстрацией] (http://codepad.viper-7.com/Etav19) – Ghost

+0

@ JB Прочитайте, если, конечно, (что не имеет смысла) тот, который вы отправили на вопрос, который я тестировал, на самом деле не был xml, с которым вы работаете с – Ghost

Смежные вопросы