Исправление кода
Несколько ошибок в вашем коде:
Ваш xpath должен быть "//person"
вместо просто "person"
.
$personXPath->evaluate()
( DOMXPath ::valu ) возвращает DOMNodeList , который является Интегратором всех DOMElement это соответствует запросу. Ваш код ожидает, что это будет DOMElement , который имеет метод hasChildNodes .
Таким образом, вы можете изменить свой код, чтобы получить правильный вывод без ошибок:
<?php
$xmlDocument=new DOMDocument;
$xmlDocument->preserveWhiteSpace=false;
$xmlDocument->load("person.xml");
$personXPath = new DOMXPath($xmlDocument);
$parentNodes = $personXPath->evaluate('//person');
foreach ($parentNodes as $parentNode) {
while ($parentNode->hasChildNodes()){
$parentNode->removeChild($parentNode->childNodes->item(0));
}
}
echo $xmlDocument->saveXML();
Это эффективно удалит все дочерние узлы всех тегов <person>
.
Вывод:
<?xml version="1.0"?>
<person/>
Просто удалите все <person>
Но приведенный выше код не удаляет теги <person>
в файле XML. Если для данной XML-структуры вы хотите удалить все теги <person>
, нет необходимости вообще удалять дочерние элементы любых <person>
:
<?php
$xmlDocument=new DOMDocument;
$xmlDocument->preserveWhiteSpace=false;
$xmlDocument->load("person.xml");
$personXPath = new DOMXPath($xmlDocument);
$personNodes = $personXPath->evaluate('//person');
foreach ($personNodes as $personNode) {
$personNode->parentNode->removeChild($personNode);
}
echo $xmlDocument->saveXML();
Вывод:
<?xml version="1.0"?>