Последние элементы XML не удаляются из XML

У меня есть два php-документа, которые имеют такую ​​же логику. Один документ – «uploader.php», который записывает в xml один раз, когда файл загружается. Другой документ – «modifier.php», который записывает в xml один раз файл, который удален. У меня есть две проблемы с этой логикой. удаляя последний элемент в списке xml, он не удаляет последний элемент, а также дублирует второй на последний элемент. Вторая проблема заключается в том, что он регистрирует ошибку на моем «uploader.php».

$xml_generator = simplexml_load_file("../file.xml"); if ( $handle = opendir( $path_to_image_dir ) ) { while (false !== ($file = readdir($handle))) { if ( is_file($path.'/'.$file) && $file != "." && $file != ".." && $file != "Thumb.db" && $file != "Thumbs.db" && $file != ".DS_Store" ) { $fileID = $i++; list( $width, $height ) = getimagesize($path.'/'.$file); $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]')[0]; if (!isset($oldImage)) { $image = $xml_generator->addChild('image'); $image->addChild('id', $fileID); $image->addChild('name', $file); $image->addChild('width', $width); $image->addChild('height', $height); $image->addChild('description', '-'); } else { $oldImage->name = $file; $oldImage->width = $width; $oldImage->height = $height; } } } closedir($handle); } $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml_generator->asXML()); echo $dom->save('../file.xml'); 

Пример первого выпуска

Image2.jpg – последний элемент в списке. Если бы я должен был удалить Image2.jpg, то второй экземпляр будет дублироваться, а Image2.jpg останется в XML-документе.

 <image> <id>9</id> <name>Image1.jpg</name> <width>2551</width> <height>1435</height> <description>-</description> </image> <image> <id>10</id> <name>Image1.jpg</name> <width>2551</width> <height>1435</height> <description>-</description> </image> <image> <id>11</id> <name>Images2.jpg</name> <width>612</width> <height>612</height> <description>-</description> </image> 

Вторая проблема – ошибка Msg .

 Undefined offset: 0 in uploader.php on line $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]')[0]; 

Я думаю, что обе эти проблемы связаны с одной и той же проблемой, пожалуйста, помогите мне решить эту проблему. Благодаря!

Удалить код – этот код может удалить любой элемент, кроме последнего элемента в списке.

 if(isset($_POST['delete'])){ foreach($_POST['file'] as $file) { if(isset($file)) { if (unlink($path."/".$file)) { echo "Delete the file: $file<br />"; if (!empty($_SERVER['HTTP_REFERER'])){ header("Location: " . $_SERVER['HTTP_REFERER']); } else { echo "No referrer."; } } else { echo "Didn't manage to delete the file: $file<br />"; } } } // very top code goes here. } 

Related of "Последние элементы XML не удаляются из XML"

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

Измените эту строку:

 $oldImage = $xml_generator->xpath('//images/image[id="'.$fileID.'"]'); if (!isset($oldImage)) 

Для того, чтобы:

 $oldImage = $xml_generator->xpath('//images/image[name="'.$file.'"]'); if (count($oldImage) == 0) 

Чтобы избежать уведомлений, измените это:

 else { $oldImage->name = $file; 

Для того, чтобы:

 else { $oldImage = $oldImage[0]; $oldImage->name = $file; 

В вашем файле удаления вам придется исключить элемент, чтобы он не реплицировался.

Вот пример:

 $filename = '../file.xml'; $xml = simplexml_load_file($filename); if(isset($_POST['delete'])) { $deleted = 0; foreach($_POST['file'] as $file) { if(isset($file)) { $image = $xml->xpath("//images/image[name='$file']"); if (!empty($image)) { if (unlink($path."/".$file)) { $deleted++; $dom=dom_import_simplexml($image[0]); $dom->parentNode->removeChild($dom); echo "Delete the file: $file<br />"; if (!empty($_SERVER['HTTP_REFERER'])) { header("Location: " . $_SERVER['HTTP_REFERER']); } else { echo "No referrer."; } } else { echo "Didn't manage to delete the file: $file<br />"; } } else { echo "File not found: $file<br />"; } } } // Avoid unnecessary saving the file if ($deleted > 0) { $dom = new DOMDocument('1.0'); $dom->preserveWhiteSpace = false; $dom->formatOutput = true; $dom->loadXML($xml->asXML()); $dom->save($filename); } } 

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