У меня есть файл XML record.xml, который выглядит следующим образом:
<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, который будет возвращать все дочерние имя узла <record>
и значение всех этих дочерних узлов в ассоциативном массиве.
Например:
Для приведенного выше 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, который будет возвращать имена дочерних узлов вместе с их значениями.
Проблема — это запись, поскольку узел является лишь частью иерархии узлов. То, что вы получаете, это все записи, однако вы также хотите спуститься и получить данные от дочерних узлов записи. Очень конкретный пример:
<?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
)
)
НОТА: Это решение зависит от конкретного случая и, вероятно, сломалось бы, если бы у вас были дополнительные вложенные иерархии (что я рекомендую вам сделать для хранения нескольких объектов).
Других решений пока нет …