Цель состоит в том, чтобы удалить каждый XML файл с тем же родителем, который соответствует идентификатору.
Проблема, с которой я столкнулся, заключалась в том, что был удален только первый XML файл. Когда я запускал этот файл, выход был "Идентификатор: 1", а также "CarlCarlok". Сценарий удалил первый XML файл с атрибутом "1". Что также было доказано, когда я проверил XML файл после этого, когда был удален комментарий с идентификатором "9". Итак... Чтобы решить эту проблему, я должен знать:
Как удалить каждый XML файл с одним и тем же родителем? Потому что теперь он удаляет только тот, с которым он сталкивается.
<?php
require '../functions.php';
$id = $_GET['id'];
echo "The id is: " . $id . "\n";
$comment_xml_path = '../data/comments.xml';
$comments_xml_file = simplexml_load_file($comment_xml_path);
foreach ($comments_xml_file->comment as $c) {
echo $c->author;
if (strcmp($id, $c['parent']) == 0) {
$dom = dom_import_simplexml($c);
$dom->parentNode->removeChild($dom);
echo "ok";
}
save_xml($comment_xml_path, $comments_xml_file);
(save_xml() - это функция для сохранения использования asXML, которое мы создали во время класса)
XML файл
<?xml version="1.0" encoding="UTF-8"?>
<comments>
<comment id="6" parent="3" date="20150317224217">
<author>Carl</author>
<cmt>3</cmt>
</comment>
<comment id="9" parent="1" date="20150312225112">
<author>Carl</author>
<cmt>dsa</cmt>
</comment>
<comment id="10" parent="1" date="20150356225256">
<author>Carl</author>
<cmt>2</cmt>
</comment>
<comment id="11" parent="1" date="20150357225257">
<author>Carl</author>
<cmt>2</cmt>
</comment>
</comments>
Вот путь с SimpleXML
и xpath()
, который похож на SQL
for XML
:
$id = 1; // parent
$xml = simplexml_load_file("some/path/to/an/xml/file.xml");
$comments = $xml->xpath("/comments/comment[@parent='$id']");
foreach ($comments as $comment) unset($comment[0]);
echo $xml->asXML(); // show result
Комментарии:
xpath
-statement выберет все <comment>
где атрибут parent
= $id
. Значение @
в заявлении означает атрибут. Условие завершено в []
. Результат сохраняется в $comments
как array
элементов SimpleXML
.<comment>
в array
. Если вы хотите удалить все дочерние childNodes
, я бы вместо этого перебирал childNodes
и вызывал removeChild()
.
Обновленный код:
if (strcmp($id, $c['parent'])== 0) {
foreach ($c->childNodes as $child) {
$child->parentNode->removeChild($child);
}
}
Предполагается, что вы используете DOMDocument. Однако, похоже, вы смешиваете это и SimpleXML
.