удалить элемент из xml

в моем XML-файле я хочу удалить элемент записи в соответствии с заголовком. Мой xml-файл

<?xml version="1.0"?> <gallerylist> <record> <movie>videos/Avatar_HD.flv</movie> <title>Title:</title> <desc>Description</desc> <preview>videos/previews/avatar.jpg</preview> <imgplaylist>videos/imgplaylist/p1.jpg</imgplaylist> <category>Category</category> </record> <record> <movie>videos/The_Princess_And_The_Frog_HD.flv</movie> <title></title> <desc>fdgdd</desc> <preview>videos/previews/frog.jpg</preview> <imgplaylist>videos/imgplaylist/p4.jpg</imgplaylist> <category>Category1</category> </record> <record> <movie>videos/Prince_of_Persia_The_Sands_of_Time_HD.flv</movie> <title>Title:2</title> <desc>xzcXZ</desc> <preview>videos/previews/sandsoftime.jpg</preview> <imgplaylist>videos/imgplaylist/p2.jpg</imgplaylist> <category>Category2</category> </record> <record> <movie>videos/Sherlock_Holmes_HD.flv</movie> <title>Title:4</title> <desc>dfgdf</desc> <preview>videos/previews/sherlock.jpg</preview> <imgplaylist>videos/imgplaylist/p7.jpg</imgplaylist> <category>Category4</category> </record> </gallerylist> 

и мой php-файл

  <?php $doc = new DOMDocument; $doc->load('playlist.xml'); $thedocument = $doc->documentElement; $list = $thedocument->getElementsByTagName('title'); $nodeToRemove = null; foreach ($list as $domElement){ $attrValue = $domElement->nodeValue; if ($attrValue == 'Title:4') { $nodeToRemove = $domElement; } } if ($nodeToRemove != null) $thedocument->removeChild($nodeToRemove); $doc->saveXML(); ?> 

он дает следующую ошибку: –

Неустранимая ошибка: исключение «DOMException» с сообщением «Не найденная ошибка» в D: \ wamp \ www \ funkeymusic \ admin \ update_video.php: 22 Трассировка стека: # 0 D: \ wamp \ www \ funkeymusic \ admin \ update_video. php (22): DOMNode-> removeChild (Object (DOMElement)) # 1 {main} брошен в D: \ wamp \ www \ funkeymusic \ admin \ update_video.php в строке 22

Вы можете вызвать removeChild() только для соответствующего родительского узла. Поскольку $nodeToRemove не является прямым дочерним элементом $thedocument (это потомок), вы получаете ошибку «not found».

 if ($nodeToRemove != null) { $nodeToRemove->parentNode->removeChild($nodeToRemove); } 

Из вопроса, который я понял, вы хотите удалить элементы <record> с дочерним элементом <title> который содержит определенный текст. Решение более подробное, чем должно быть, и $attrValue предполагает, что DOMText элемента title является атрибутом, который он не является. Но в любом случае, давайте удалим все это и используем XPath:

 $searchString = 'Title:4'; $doc = new DOMDocument; $doc->preserveWhiteSpace = FALSE; $doc->load('playlist.xml'); $xPath = new DOMXPath($doc); $query = sprintf('//record[./title[contains(., "%s")]]', $searchString); foreach($xPath->query($query) as $node) { $node->parentNode->removeChild($node); } $doc->formatOutput = TRUE; echo $doc->saveXML(); 

XPath говорит, найдите все узлы записи, у которых есть дочерний заголовок с текстовым узлом, содержащим строку поиска. Обратите внимание, что содержащий, не означает, что это равно, поэтому, если вы будете использовать «Title:» в качестве $searchString , он удалит все фильмы, кроме «The_Princess_And_The_Frog_HD». Если вы хотите удалить точные заголовки, измените XPath на

 '//record[./title[text()="%s"]]' 

Узнайте больше о XPath в W3C, но обратите внимание, что PHP поддерживает только XPath1.0.