2015-03-04 1 views
0

Целью является удаление каждого дочернего элемента XML с тем же родителем, который соответствует идентификатору.PHP - удалить детей с определенным атрибутом в php

Проблема я столкнулся в том, что только первый 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-файла после удаления первого совпадения. Остальная часть кода не отображается. Значит, вы, возможно, слишком рано сберегаете? – hakre

ответ

0

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

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

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

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

+0

Как бы вы включили это в скрипт? – PandaBearMoose

+0

Спасибо, я попробую! – PandaBearMoose

1

Вот способ с SimpleXML и xpath(), который, как SQL для 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.