Удалить корневой элемент и все дочерние элементы через PHP DOM Document - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь удалить все данные из моего XML-файла через PHP DOM Document. По сути, я хочу, чтобы весь XML-файл был пустым. Я пытаюсь добиться этого с помощью DOM Document & XPath.

Я получаю ошибки

Неопределенное свойство, Неустранимая ошибка: Uncaught Ошибка: вызов функции-члена hasChildNodes () иТрассировка стека: # 0 {main} добавлено.

Пожалуйста, помогите.

delete.php

<?php 
    $xmlDocument=new DOMDocument;
    $xmlDocument->preserveWhiteSpace=false;
    $xmlDocument->load("person.xml");
    $personXPath = new DOMXPath($xmlDocument);

    $parentNode=$personXPath-> evaluate('person');
        while ($parentNode->hasChildNodes()){
        $parentNode->removeChild($parentNode->childNodes->item(0));
 }

 ?>

person.xml

<person>
    <personN number="8">
        <personL letter="Y">
            <fullname>
                <firstname>Carl</firstname>
                <lastname>Steel</lastname>
            </fullname>
            <appearance>
                <eye>brown</eye>
            </appearance>
        </personL>  
    </personN>
  <personN number="9">
        <personL letter="Z">
            <fullname>
                <firstname>Paul</firstname>
                <lastname>Steel</lastname>
            </fullname>
            <appearance>
                <eye>blue</eye>
            </appearance>
        </personL>  
    </personN>
</person>

1 Ответ

0 голосов
/ 17 октября 2019

Исправление кода

Несколько ошибок в вашем коде:

  1. Ваш xpath должен быть "//person" вместо просто "person".

  2. $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"?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...