ФорумПрограммированиеPHP для идиотов → Получить данные из узла XML

Получить данные из узла XML

  • progs

    Сообщения: 59 Репутация: N Группа: Кто попало

    Spritz 15 апреля 2010 г. 11:07

    Имеется дерево вида

    <item name="Главная" id="0">
    <li id="1" name="Нефтепродукты" type="Категория">
    <li id="2" name="Керосины" type="Категория">
    <li id="3" name="Керосин" type="Категория">
    <bi name="Керосин 10л" type="Товар" price="120 руб." unit="л" qty="100"/>
    <bi name="Керосин 1л" type="Товар" price="15 руб." unit="л" qty="130"/>
    <bi name="Керосин 5л" type="Товар" price="65 руб." unit="л" qty="170"/>
    <bi name="Керосин 0.5л" type="Товар" price="25 руб." unit="л" qty="570"/>
    </li>
    <li id="4" name="Керосин в бочках" type="Категория">
    <bi name="Керосин в бочке" type="Товар" price="2500 руб." unit="л" qty="17"/>
    </li>
    </li>
    </li>
    </item>
    Как мне узнать какой следующий узел идет за текущим и получить его значение, т.е. к примеру я нахожусь в узле li с id=3 как мне получить ссылку на следующий за ним узел bi …. перепробовал различный конструкции

    $node->firstChild; $node->nextNode() ничего из них не дает результат, на выходе ошибка

    запрос обхода дерева делаю следующим образом foreach ($xp->query('//*[@id="'.$id.'"]') as $node)….подскажите как мне получить ссылку на данный элемент :(
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 15 апреля 2010 г. 11:20, спустя 12 минут 55 секунд

    progs, чем в вашем случае является $node ?
    ничего из них не дает результат, на выходе ошибка

    какая ошибка ?
    запрос обхода дерева делаю следующим образом foreach ($xp->query('//*[@id="'.$id.'"]') as $node)

    что такое $xp ?
  • progs

    Сообщения: 59 Репутация: N Группа: Кто попало

    Spritz 15 апреля 2010 г. 11:25, спустя 5 минут 2 секунды


    progs, чем в вашем случае является $node ?
    ничего из них не дает результат, на выходе ошибка

    какая ошибка ?

    Catchable fatal error: Object of class DOMText could not be converted to string in….


    progs, чем в вашем случае является $node ?
    запрос обхода дерева делаю следующим образом foreach ($xp->query('//*[@id="'.$id.'"]') as $node)

    что такое $xp ?


    $dom = new DomDocument();

    if(!$dom->load("test.xml")){echo "<h2>Ошибка загрузки XML</h2>";}

    $xp = new domXPath($dom);
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2010 г. 11:28, спустя 2 минуты 33 секунды

    progs, ебота, simplexml юзай
    Сапожник без сапог
  • progs

    Сообщения: 59 Репутация: N Группа: Кто попало

    Spritz 15 апреля 2010 г. 11:28, спустя 52 секунды


    progs, ебота, simplexml юзай

    а где про него почитать можно?
  • Chiffa

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2010 г. 11:31, спустя 2 минуты 23 секунды

    simplexml первая ссылка - то что вам надо
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2010 г. 11:31, спустя 14 секунд



    progs, ебота, simplexml юзай

    а где про него почитать можно?
    а про domdocument где прочитал?
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 15 апреля 2010 г. 11:31, спустя 26 секунд

    [man]simplexml[/man]
  • progs

    Сообщения: 59 Репутация: N Группа: Кто попало

    Spritz 15 апреля 2010 г. 11:34, спустя 2 минуты 42 секунды




    progs, ебота, simplexml юзай

    а где про него почитать можно?
    а про domdocument где прочитал?

    тут примеры взял http://zvon.org/xxl/XPathTutorial/General_rus/examples.html а саму инфу здесь http://phpclub.ru/faq/PHP5/XML?v=nnm
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 15 апреля 2010 г. 11:36, спустя 2 минуты 2 секунды

    на сайте php.net есть официальнйы мануал, читай все там, там все красиво описано, с примерами даже
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 15 апреля 2010 г. 11:41, спустя 5 минут 13 секунд


    на сайте php.net есть официальнйы мануал, читай все там, там все красиво описано, с примерами даже
    жаль про этот сайт русская школота не слышала, а всякие хуеты типа попока наизусть знают :D
    Спустя 10 сек.
    *попова
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 15 апреля 2010 г. 12:10, спустя 29 минут 4 секунды

    потому что:
    а) нет такого метода nextNode(), есть свойства nextSibling/previousSibling;
    б) DOMNode не кастуется в строку, чтобы узнать, что за узел у тебя в переменной, нельзя делать просто echo $node; нужно хотябы так: echo $node->nodeName;
    в) DOMNodeList не наследует IteratorAggregate, поэтому с ним нельзя работать как с массивом в foreach, доступ к узлам в полученном списке осуществляется через метод item($index), кол-во итемов можно узнать из свойства length

    $test = <<<heredoc
    <item name="Главная" id="0">
    <li id="1" name="Нефтепродукты" type="Категория">
    <li id="2" name="Керосины" type="Категория">
    <li id="3" name="Керосин" type="Категория">
    <bi name="Керосин 10л" type="Товар" price="120 руб." unit="л" qty="100" />
    <bi name="Керосин 1л" type="Товар" price="15 руб." unit="л" qty="130" />
    <bi name="Керосин 5л" type="Товар" price="65 руб." unit="л" qty="170" />
    <bi name="Керосин 0.5л" type="Товар" price="25 руб." unit="л" qty="570" />
    </li>
    <li id="4" name="Керосин в бочках" type="Категория">
    <bi name="Керосин в бочке" type="Товар" price="2500 руб." unit="л" qty="17" />
    </li>
    </li>
    </li>
    </item>
    heredoc;

    $dom = new DOMDocument('1.1', 'UTF-8');
    $dom->loadXML($test);

    $node = $dom->firstChild;
    echo $node->nodeName . "\n";
    if (!is_null($node->nextSibling))
    {
    // следущего элемента нет на самом деле, по этому тут ничего не выводится
    $node->nextSibling->nodeName . "\n";
    }

    $xpath = new DOMXPath($dom);
    for ($i = 1; $i < 4; $i++)
    {
    // запрос к экспаф конечно уныл, если нужен элемент по айди лучше воспользоваться getElementById
    $nodes = $xpath->query('//*[@id="'.$i.'"]');
    if ($nodes->length > 0)
    {
    for ($j = 0; $j < $nodes->length; $j++)
    {
    echo 'id=' . $i . ': ' . $nodes->item($j)->getAttribute('name') . "\n";
    }
    }
    else
    {
    echo 'id=' . $i . ": empty\n";
    }
    }
    Work, buy, consume, die
  • progs

    Сообщения: 59 Репутация: N Группа: Кто попало

    Spritz 18 апреля 2010 г. 3:56, спустя 2 дня 15 часов 45 минут

    Всем спасибо, разобрался с выводом, использую simplexml…И возник еще один вопрос, к примеру у нас имеется такая часть дерева:
    <li id="3" name="Узел" type="Категория">
    <bi name="Товар №1" type="Товар" price="120 руб." unit="л" qty="100" />
    <bi name="Товар №2" type="Товар" price="15 руб." unit="л" qty="130" />
    <bi name="Товар №3" type="Товар" price="65 руб." unit="л" qty="170" />
    <bi name="Товар №4" type="Товар" price="17 руб." unit="л" qty="170" />
    <bi name="Товар №5" type="Товар" price="135 руб." unit="л" qty="170" />
    <bi name="Товар №6" type="Товар" price="121 руб." unit="л" qty="170" />
    <bi name="Товар №7" type="Товар" price="116 руб." unit="л" qty="170" />
    <bi name="Товар №8" type="Товар" price="108 руб." unit="л" qty="170" />
    <bi name="Товар №9" type="Товар" price="120 руб." unit="л" qty="100" />
    <bi name="Товар №10" type="Товар" price="15 руб." unit="л" qty="130" />
    </li>

    Как после запроса
    $res = simplexml_load_file("example.xml");
    $size=sizeof($res->xpath("//li[@id=$id]/bi"));

    $mass=$res->xpath("//li[@id=$id]/bi");

    Выводить товары к примеру только с 5 по 10юююмы получаем ассоциативный массив при запросе, каким образом обращаться к элементам по индексам к примеру $mass[1]? Ведь такая конструкция воспринимается как обращение к элементу с атрибутом 1…может есть какие-нибудь функции в xpath или simplexml которые помогут решить данный вопрос с выводом дерева по частям? Спс
  • progs

    Сообщения: 59 Репутация: N Группа: Кто попало

    Spritz 18 апреля 2010 г. 4:10, спустя 14 минут 17 секунд

    проблема решена :) использовал функции xpath для определения позиции

    $res->xpath("//li[@id=$id]/bi[position() >= 5 and position() <= 10 ]")

Пожалуйста, авторизуйтесь, чтобы написать комментарий!