xml — PHP + XPath Query получает дочерние узлы и их значения

У меня есть файл 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, который будет возвращать имена дочерних узлов вместе с их значениями.

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
)

)

НОТА: Это решение зависит от конкретного случая и, вероятно, сломалось бы, если бы у вас были дополнительные вложенные иерархии (что я рекомендую вам сделать для хранения нескольких объектов).

4

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

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

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