удаление узлов из XML с переполнением стека

Я пытаюсь удалить все NodePrices, которые не соответствуют конкретному NodeName, для этого примера Place2. Вот образец XML

<DocHeader>
<DocTitle>Node Price Report</DocTitle>
<DocRevision>1</DocRevision>
<DocConfidentiality>
<DocConfClass>PUB</DocConfClass>
</DocConfidentiality>
<CreatedAt>2018-02-03T13:02:01</CreatedAt>
</DocHeader>
<DocBody>
<NodePrices>
<NodeName>Place1</NodeName>
<Contact>Employee1</Contact>
</NodePrices>
<NodePrices>
<NodeName>Place2</NodeName>
<Contact>Employee2</Contact>
</NodePrices>
<NodePrices>
<NodeName>Place3</NodeName>
<Contact>Employee3</Contact>
</NodePrices>
</DocBody>

Я нашел ранее заданный вопрос, который выглядит как ответ на мой вопрос, однако результаты оказались не такими, как я ожидал. Когда я запускаю код и отображаю результаты, которые соответствуют ожиданиям, я вижу Place2. Когда я сохраняю результаты в файле Place2, мне не хватает только DocHeader. Что я делаю неправильно?

Предыдущий пост Как изменить XML-файл с помощью PHP

Вот мой PHP

$dom=new DOMDocument();
$dom->load("Nodes.xml");

$root=$dom->documentElement;

$nodesToDelete=array();

$markers=$root->getElementsByTagName('NodePrices');

// Loop trough childNodes
foreach ($markers as $marker) {
$NodeName=$marker->getElementsByTagName('NodeName')->item(0)->textContent;

if($NodeName=='Place2') {
continue;
}

$nodesToDelete[]=$marker;
}

// You delete the nodes
foreach ($nodesToDelete as $node) {
$node->parentNode->removeChild($node);
}

echo $dom->saveXML();
$dom->save('FilteredNodes.xml');

1

Решение

При удалении узла в XML и DOM это обычно оставляет пробел. Это связано с форматированием документа и тем, что обычно существует узел DOMText до фактического узла данных. Чтобы закрыть этот пробел, вам также нужно удалить этот узел, а также данные …

foreach ($nodesToDelete as $node) {
$prevNode = $node->previousSibling;
if ( $prevNode != null && $prevNode instanceof DOMText )    {
$node->parentNode->removeChild($prevNode);
}
$node->parentNode->removeChild($node);
}
0

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

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

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