PHP - удалить детей с определенным атрибутом в php [duplicate]

0

Цель состоит в том, чтобы удалить каждый 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>
  • 0
    Код, который вы задали здесь, заканчивается после сохранения файла XML после удаления первого совпадения. Остальная часть кода не показана. Таким образом, вы, возможно, экономите слишком рано?
Теги:
elements
parent-child

2 ответа

1

Вот путь с 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

Комментарии:

  • строка 3: xpath -statement выберет все <comment> где атрибут parent= $id. Значение @ в заявлении означает атрибут. Условие завершено в []. Результат сохраняется в $comments как array элементов SimpleXML.
  • строка 4: удаление каждого <comment> в array.
0

Если вы хотите удалить все дочерние childNodes, я бы вместо этого перебирал childNodes и вызывал removeChild().

Обновленный код:

if (strcmp($id, $c['parent'])== 0) {
    foreach ($c->childNodes as $child) {
        $child->parentNode->removeChild($child);
    }
}

Предполагается, что вы используете DOMDocument. Однако, похоже, вы смешиваете это и SimpleXML.

  • 0
    Как бы вы включили это в сценарий?
  • 0
    Спасибо, попробую!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню