в моем 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.