php xml удалить узел

массивы — Использование unset () для удаления узла в XML; PHP / simplexml_load_file

Я пытаюсь использовать unset() удалить узел в XML с помощью PHP и не может понять, что здесь происходит. Кажется, он работает неправильно, и я видел здесь много других вопросов подобного характера, но, похоже, они не решают эту проблему напрямую. Вот как выглядит мой XML:

Мой цикл, который я использую, выглядит следующим образом:

Когда электронное письмо совпадает с «test@test.com», я хочу иметь возможность удалить все это user узел. Кажется, что это должно работать, но я не могу понять, почему это не будет? Любая помощь будет принята с благодарностью. Спасибо!

Решение

Однако будет проблема с вашим foreach() если вы удалите узел в середине цикла.

Я предлагаю использовать xpath() вместо цикла, IMO элегантный и код гораздо проще.

создаст массив всех с этим адресом электронной почты.

удалит первого пользователя в этом массиве.

удалит весь массив.

Другие решения

SimpeXML не предназначен для перехода на структуру XML. Просто простой способ чтения XML.

Вот пример кода, который решает вашу проблему и демонстрирует использование dom_import_simplexml.

При чтении этого кода вы можете подумать, почему это работает, поскольку мы не сохраняем новую структуру нигде после того, как выполнили RemoveChild функция. Это работает, потому что функции DOM не создают копии базовых объектов, а вместо этого управляют ими напрямую.

Источник

Я создал PHP script, который строит таблицу из XML-документа через AJAX. Например:

Создал бы стол с заголовком, автором, годом и ценой, плюс дополнительный удаляемый столб. При анализе XML я установил tr id как текущий элемент XML (0 и 1) в приведенном выше случае.

Когда я нажимаю delete, я запускаю запрос AJAX с идентификатором строки, которую я хочу удалить. Удалить script получает номер текущей строки без проблем, но при попытке удалить его возникают странные результаты. Текущий код, который я пытаюсь, приведен ниже (взято из http://quest4knowledge.wordpress.com/2010/09/04/php-xml-create-add-edit-modify-using-dom-simplexml-xpath/ 7.2)

Я создаю таблицу на загрузке страницы, а затем при каждом удалении. Проблема в том, что неправильные строки удаляются, и я не могу понять, почему.

ДОПОЛНИТЕЛЬНЫЕ ИСПЫТАНИЯ.

Удаляет первый node на 50% кликов:

Всегда удаляет первый node:

Удаляет второй node на 50% кликов:

Всегда удаляет второй node:

Удаляет третий node на 50% кликов:

Всегда удаляет третий node:

ADDED MY AJAX CODE

Вот как выглядят таблицы в таблице, и я могу предупредить trID без проблем.

Может кто-нибудь объяснить, что я вижу здесь. Спасибо!

Вы не принимаете во внимание, что childNodes() включает все узлы, а не только элементы.

Теперь вы знаете, почему DOM настолько раздражает.

DOMXPath решение

SimpleXML решение

Проблемы

Однако у вас есть две серьезные проблемы с вашим подходом.

Вы не учитываете concurrency. Это проявляется двумя способами:

    Если два пользователя одновременно редактируют и один удаляет книгу 0, тогда, когда вторая удаляет книгу 0, он будет удалять другую книгу, чем он предполагал, то есть то, что кажется ему книгой 1! Решением этого является то, что каждая книга нуждается в явном, уникальном идентификаторе, который вы используете в файле XML и вашем html-интерфейсе. Вы не можете использовать нумерацию индексов для идентификации узлов.
    Ваши чтения и записи в XML файл и из него не являются атомарными и не используют блокировку файлов. Таким образом, кто-то может читать XML, в то время как другой процесс PHP находится в середине записи в файл, что дает читателю неполный XML файл. Вы должны либо выполнить атомарную запись (в системах * nix, записать в уникальный временный файл, а затем link() в имя реального файла), или вы должны открыть файл с помощью flock() или другого механизма блокировки.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *