2016-06-22 5 views
1

У меня есть XML-файл record.xml который выглядит как:PHP + XPath запросы получить дочерние узлы и их значения

<record> 
    <name>john</name> 
    <gender>male</gender> 
    <subject>mathematics, english, science</subject> 
</record> 
<record> 
    <name>jamie</name> 
    <gender>female</gender> 
    <subject>mathematics, science</subject> 
</record> 
<record> 
    <name>jack</name> 
    <gender>male</gender> 
    <subject>social-science, english</subject> 
</record> 

Я хочу написать XPATH запрос, который будет возвращать все ребенок NODENAME из <record> и ценностей всех этих дочерних узлов в ассоциативном массиве.

Для Ex .:

Для выше XML-файл Выходной массив должен быть-

array{ 
    [0] => array{ 
       [name] = 'john', 
       [gender] = 'male', 
       [subject] = 'mathematics, english, science' 
      } 
    [1] => array{ 
       [name] = 'jamie', 
       [gender] = 'female', 
       [subject] = 'mathematics, science' 
      } 
    [2] => array{ 
       [name] = 'jack', 
       [gender] = 'male', 
       [subject] = 'social-science, english' 
      } 
} 

Ниже часть кодекса я написал это возвращение все <record> дочерние узлы ценности, но не их имя узла.

....... 
    ....... 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('record.xml'); 
    $xpathvar = new Domxpath($xmldoc); 
    $res = $xpathvar->query('//record'); 
    foreach($res as $data){ 
      //$data do not contain node values 
      $arr[] = $data->textContent; 
    } 
    //process $arr to get required format 
    ..... 
    ..... 

Мне просто нужен запрос Xpath, который будет возвращать имена дочерних узлов вместе с их значениями.

ответ

2

Проблема - запись, поскольку узел является лишь частью иерархии узлов. То, что вы получаете, это все записи, однако вы также хотите спуститься и получить данные из дочерних узлов записи. Очень случай конкретный пример:

<?php  
$xmldoc = new DOMDocument(); 
$xmldoc->load('record.xml'); 
$xpathvar = new Domxpath($xmldoc); 
$res = $xpathvar->query('//record'); 
foreach($res as $data){ 
    $narr = []; 
    foreach ($data->childNodes as $cnode) { 
     $narr[$cnode->nodeName] = $cnode->nodeValue; 
    } 
    $arr[] = $narr; 

}  
print_r($arr); 

должен выдать что-то вроде:

Array 
(
    [0] => Array 
     (
      [name] => john 
      [gender] => male 
      [subject] => mathematics, english, science 
     ) 

    [1] => Array 
     (
      [name] => jamie 
      [gender] => female 
      [subject] => mathematics, science 
     ) 

    [2] => Array 
     (
      [name] => jack 
      [gender] => male 
      [subject] => social-science, english 
     ) 

) 

Примечание: Это решение очень каждому конкретному случаю и, вероятно, сломаться, если у вас есть дополнительные вложенные иерархии (которые я рекомендую вы делаете, чтобы хранить несколько предметов).

+0

хорошо, я думаю, это будет достаточно для меня, чтобы продолжить дальше. благодаря – Ajay

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