Список узлов имеет только одно измерение, поэтому на самом деле нецелесообразно сериализовать детали нескольких элементов в один список.
Обычно вы используете одно выражение Xpath для идентификации ваших узлов списка , а затем методы DOM и относительные выражения для извлечения данных, связанных с этими узлами:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
foreach ($xpath->evaluate('//host_info[hostname="localhost" and vulnerability_id="remote_execution"]') as $hostInfo) {
var_dump(
[
$hostInfo->getAttribute('exclude'),
$xpath->evaluate('string(parent::*/background)', $hostInfo),
$xpath->evaluate('string(parent::*/resolution)', $hostInfo)
]
);
}
ДляОтдельный элемент позволяет получить все узлы детали в один список результатов. Однако такое выражение быстро усложняется, и вам необходимо добавить логику, которая распознает различные узлы детализации.
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
$expression = <<<'XPATH'
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/@exclude|
(//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/parent::*/background)[1]|
(//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/parent::*/resolution)[1]
XPATH;
foreach ($xpath->evaluate($expression) as $detail) {
var_dump(
$detail->localName, $detail->textContent
);
}