Arhn - архитектура программирования

Удалить дочерний узел XML

Интересно, может ли кто-нибудь помочь мне, пожалуйста.

Я использую эту страницу, чтобы пользователи могли просматривать галерею загруженных изображений.

После загрузки изображения сохраняются в этом пути к файлу UploadedFiles/userid/locationid/image, а сведения об изображении, т. е. имя, описание и т. д., сохраняются в файле XML с именем files.xml, который находится в том же каталоге, что и изображения. Выдержка из этого показана ниже:

<?xml version="1.0" encoding="utf-8" ?> 
- <files>
  <file name="AC-0003749-Clark_145520.jpg" source="AC-0003749-Clark_145520.jpg" size="3873" originalname="AC-0003749-Clark_145520.jpg" description="No description provided" userid="1" locationid="1" /> 
  </files>

Галерея предоставляет пользователю дополнительные функциональные возможности с помощью значка под каждым изображением, позволяющего удалить каждое изображение. Это делается с помощью следующего кода:

Событие нажатия значка

<script type="text/javascript"> 
        Galleria.ready(function() {
            this.$('thumblink').click();

        $(".galleria-image").append( 
        "<span class='btn-delete ui-icon ui-icon-trash'></span>"); 
        $(".btn-delete").live("click", function(){
        var img = $(this).closest(".galleria-image").find("img"); 

        // send the AJAX request
        $.ajax({
        url : 'delete.php',
        type : 'post',
        data : { image : img.attr('src') },
        success : function(){
        alert('Deleting image... ');
        img.parent().fadeOut('slow');
        }
        });

        return false;
        });

        });

    </script>

delete.php — измененный код

<?php 

if (!empty($_POST)) { 
$image = $_POST['image']; 

if (file_exists($image)) { 
unlink($image); 
} 
} 

$doc = new DOMDocument; 
$doc->load('files.xml'); 

$thedocument = $doc->documentElement; 

$list = $thedocument->getElementsByTagName('files'); 

$nodeToRemove = null; 
foreach ($list as $domElement){ 
if ($attrValue == '$image') {     $domElement->parentNode->removeChild($domElement); } 
}

if ($nodeToRemove != null) 
$thedocument->removeChild($nodeToRemove); 

echo $doc->saveXML(); 
?> 

Удаление физического образа работает нормально, но мне очень трудно понять, как удалить соответствующий дочерний узел. Хотя я не получаю сообщения об ошибке, узел не удаляется. Я получил некоторые рекомендации здесь с этого сайта о том, как это сделать, т.е. через PHP XML DOM, но, честно говоря, чем больше я об этом читаю, тем больше путаюсь. Я просто не могу уложиться в голове.

Мне просто интересно, может ли кто-нибудь взглянуть на это, пожалуйста, и дайте мне знать, где я ошибся.

Большое спасибо и с уважением

14.05.2012

Ответы:


1

Чтобы удалить узел, который был найден с помощью getElementsByTagName, вы можете использовать следующее:

if (!empty($_POST)) { 
    $image = $_POST['image']; 

    if (file_exists($image)) { 
        unlink($image); 
    }

    $doc = new DOMDocument; 
    $doc->load('files.xml');

    // iterate over all tags named <file>
    $list = $doc->getElementsByTagName('file');
    foreach ($list as $domElement) {
        // check whether attribute 'source' equals $image
        if ($domElement->getAttribute('source') == $image) {
            // remove the node
            $domElement->parentNode->removeChild($domElement);
        } 
    }

    echo $doc->saveXML();
}
14.05.2012
  • Привет @Jack, спасибо, что нашли время ответить на мой пост. Простите меня за вопрос, не могли бы вы уточнить, какие строки я должен удалить, чтобы заменить их вашим предложением, пожалуйста. Как я уже сказал, я действительно новичок в работе с файлами XML. С уважением и благодарностью 14.05.2012
  • Привет, спасибо за вашу постоянную помощь в этом, это очень ценится. К сожалению, хотя, и я уверен, что это я делаю что-то не так, я не могу заставить узел удалить из XML-файла. Я обновил свой исходный пост с измененным кодом. Я просто подумал, не могли бы вы взглянуть на это, пожалуйста, чтобы увидеть, где я ошибся. Искренняя благодарность и привет 15.05.2012
  • @IRHM Снова обновил ответ, я должен напомнить вам, что выполнение unlink() на основе опубликованной переменной, такой как $image, без проверки ее значения довольно опасно ... упражнение для читателя. 15.05.2012
  • Привет, @Jack, искренне благодарю за помощь. Я принял к сведению ваше предупреждение. Я намерен проверить значение, как только разберусь с удалением узла. Я пробовал код, но, к сожалению, он не удаляет соответствующий узел из файлов XML. Могу я уточнить у вас, пожалуйста, должен ли файл «delete.php» находиться в том же месте, что и XML-файл? просто мысль. Спасибо и добрые пожелания 15.05.2012
  • @IRHM в той же папке да, иначе он не будет знать, откуда загрузить files.xml ... кстати, я бы рекомендовал добавить `error_reporting (-1); ini_set('display_errors', 'Вкл'); в верхней части вашего скрипта. 15.05.2012
  • Привет @Jack, спасибо, что так быстро ответили. Я думаю, что проблема может быть в месте. У меня проблема в том, что файл files.xml относится к файлам userid и locationid, значения которых используются для создания папок в моей структуре папок, то есть UploadedFiles/userid/locationid/files.xml. Файл delete.php находится на самом верхнем уровне, поэтому до UploadedFiles. Я думаю, мне придется поиграть с попыткой передать переменные сеанса «userid» и «locationid» в файл «delete.php». Большое спасибо и с уважением. 15.05.2012
  • @IRHM хорошо, но я уже предполагал, что смогу прочитать файл. Если XML отображается на экране, вы смогли его прочитать. Имейте в виду, что ->saveXML() не выполняет обратную запись в файл. 16.05.2012
  • Привет, @Jack, к сожалению, когда я запускаю скрипт «delete.php», вывод xml не отображается, я думаю, что это часть проблемы. Я не вижу, что происходит. Я думаю, что мне придется потратить некоторое время на просмотр этого. Большое спасибо за вашу помощь и терпение. С уважением 16.05.2012
  • Тогда я бы предложил добавить error_reporting(-1); ini_set('display_errors', 'On'); в начало вашего кода. Это должно дать вам хорошее представление о том, где искать. 16.05.2012
  • Привет @Jack, большое спасибо за это. Ваше время и усилия очень ценятся. С уважением 16.05.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..