Удалить все элементы определенного типа из документа XML с помощью PHP - PullRequest
2 голосов
/ 14 ноября 2010

У меня есть простая задача: удалить <places> узлы и их потомков из документа XML, оставив другие узлы.

Я пробовал этот код, но он не работал ...

$document->preserveWhiteSpace = false; 
$books = $xpath->query('piletilve_info/places');
//echo "4";

foreach ($books as $places) {
    while($places->hasChildNodes()) {
        $places->removeChild($places->childNodes->item(0));
    }

    $places->parentNode->removeChild($places);
}

Исходный XML для обработки:

<piletilve_info>
   <places>
      <place>
        ...
      </place>
   </places>
   <other node>
      ...
   </other node>
</piletilve_info>

В реальных данных есть больше узлов, которые не являются местами, но для простоты в этом примере показаны только несколько.

Я видел примеры на C #, но мне не удается перенести код на PHP.

Уточнение : во фрагменте кода переменная $books является просто держателем запрашиваемого списка.Имя не имеет значения.

Ответы [ 2 ]

4 голосов
/ 14 ноября 2010

Цель состоит в том, чтобы удалить весь узел, оставляя другие узлы (на самом деле их больше, но для простоты этот пример показывает, что все

$dom = new DOMDocument;
$dom->load('places.xml');
foreach ($dom->getElementsByTagName('places') as $places)
{
    $places->parentNode->removeChild($places);
}
echo $dom->saveXml();

удаляют все элементы <places> в любом месте вдокумент, включая любые дочерние.

Вывод:

<?xml version="1.0"?>
<piletilve_info>

   <other>
      ...
   </other>
</piletilve_info>
1 голос
/ 20 марта 2019

Когда я использовал принятый ответ, он не удалял бы все вхождения тега. Цикл foreach будет пропускать теги, вероятно, потому что foreach использует внутренний указатель массива, а изменение его в цикле приводит к неожиданному поведению.

Рабочее решение, которое я нашел, выглядит следующим образом.

$dom = new DOMDocument;
$dom->load('places.xml');
$placesNodes = $dom->getElementsByTagName('places') 
while ($placesNodes->length > 0) {
    $node = $placesNodes->item(0);
    $node->parentNode->removeChild($node);
}
echo $dom->saveXml();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...