За последние 24 часа нас посетили 15850 программистов и 1641 робот. Сейчас ищут 1047 программистов ...

Удаление нода из ХМЛ

Тема в разделе "PHP для новичков", создана пользователем nOobCrafter, 2 июн 2009.

  1. nOobCrafter

    nOobCrafter Активный пользователь

    С нами с:
    28 май 2009
    Сообщения:
    11
    Симпатии:
    0
    День добрый, собсна вопрос в названии, как лучше удалить определенный нод из хмля?
    Ситуация такова, есть форму заказов, люди пишут что им надо, и запись заносится в хмл вида:
    Код (Text):
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <items header="Список фильмов доступных для скачивания">
    3. <item film="filmName" who="userName" />
    4. <item film="filmName" who="userName" />
    5. ......
    6. </items>
    Может кто предложить хороший алгоритм? Работал пока с SimpleXML и у меня пока 2 идеи искать по одному из аттрибутов или же еще могу узнать номер нужного нода. Ну допустим найду что хочу (это не сложно), а как удалить можно? или нужно сосчитать заново, но без "ненужого" нода и записать в файл? Неохота изобретать велосипед
     
  2. Andrey5555

    Andrey5555 Активный пользователь

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Конкретнее можно что нужно, а то не совсем понятно.

    P.S. нод - это "код"?
    хмля - это "xml"?
     
  3. nOobCrafter

    nOobCrafter Активный пользователь

    С нами с:
    28 май 2009
    Сообщения:
    11
    Симпатии:
    0
    нод — node (<item film="filmName" who="userName" /> - вот такая штука)
    про xml угадали) как достучаться до нужного мне нода я в принципе понял, передаю из флеша его номер, и потом через foreach смогу найти то что мне надо, вопрос в том что мне с ним дальше делать? есть какая нить простая функция или нужен какой то финт ушами?
    PHP:
    1. <?php
    2. class changeXML
    3. {
    4.     public function remove($xmlFile, $nodeNum)
    5.     {      
    6.         $xml = simplexml_load_file($xmlFile);
    7.         $nodeForRemove = $xml -> item[$nodeNum]['film'];
    8.         echo "\n".$nodeForRemove;            // вот так достукиваюсь, аттрибут просто для наглядости.
    9.     }
    10. }
    11. ?>
    омрачает картину то что метод removeChild($nodeForRemove); есть только у DOMdocument'a. Вот пример из хелпа:
    PHP:
    1. <?php
    2.  
    3. $doc = new DOMDocument;
    4. $doc->load('book.xml');
    5.  
    6. $book = $doc->documentElement;
    7.  
    8. // we retrieve the chapter and remove it from the book
    9. $chapter = $book->getElementsByTagName('chapter')->item(0);
    10. $oldchapter = $book->removeChild($chapter);
    11.  
    12. echo $doc->saveXML();
    13. ?>
    Вопрос, как в моем случае достучаться до елемента под номером $nodeNum? То есть вместо этого:
    PHP:
    1. $chapter = $book->getElementsByTagName('chapter')->item(0);
    хочу что бы как приерно выше было
    PHP:
    1. $nodeForRemove = $xml -> item[$nodeNum];
     
  4. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    В SimpleXML не встречал такой возможности. В DOM у каждого DOMNode есть метод removeChild
     
  5. nOobCrafter

    nOobCrafter Активный пользователь

    С нами с:
    28 май 2009
    Сообщения:
    11
    Симпатии:
    0
    AlexGousev это я уже заметил, а как мне можно достучаться до нода под номером $nodeNum? (ну до любого существующего нода под существующим номером)
     
  6. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    nOobCrafter
    В DOM $node->childNodes->item(номер нода, начиная с 0)
     
  7. nOobCrafter

    nOobCrafter Активный пользователь

    С нами с:
    28 май 2009
    Сообщения:
    11
    Симпатии:
    0
    ага, спс, а то я без childNodes пробовал и ниччо невыходило, щас проверю
    -----------------------------
    бббрррр... бред какой то, эти коменты в онлайн хелпе путают шо ппц, делаю так:
    $nodeArray = $book -> childNodes;
    но немогу пока вывести, так же наткнулся на child_nodes(); что где и как ипользовать непонятно, немог бы кто нить примерчик более менее рабочий чиркануть?