Форум → Программирование → PHP для идиотов → Получить данные из узла XML
Получить данные из узла XML
-
Имеется дерево вида
<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)….подскажите как мне получить ссылку на данный элемент :(
-
15 апреля 2010 г. 19:20, спустя 12 минут 55 секунд
progs, чем в вашем случае является $node ?ничего из них не дает результат, на выходе ошибка
какая ошибка ?запрос обхода дерева делаю следующим образом foreach ($xp->query('//*[@id="'.$id.'"]') as $node)
что такое $xp ? -
15 апреля 2010 г. 19: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); -
-
15 апреля 2010 г. 19:28, спустя 52 секунды
progs, ебота, simplexml юзай
а где про него почитать можно? -
-
15 апреля 2010 г. 19:31, спустя 14 секунд
а про domdocument где прочитал?
progs, ебота, simplexml юзай
а где про него почитать можно?Сапожник без сапог -
-
15 апреля 2010 г. 19:34, спустя 2 минуты 42 секунды
а про domdocument где прочитал?
progs, ебота, simplexml юзай
а где про него почитать можно?
тут примеры взял http://zvon.org/xxl/XPathTutorial/General_rus/examples.html а саму инфу здесь http://phpclub.ru/faq/PHP5/XML?v=nnm -
15 апреля 2010 г. 19:36, спустя 2 минуты 2 секунды
на сайте php.net есть официальнйы мануал, читай все там, там все красиво описано, с примерами даже -
15 апреля 2010 г. 19:41, спустя 5 минут 13 секунд
жаль про этот сайт русская школота не слышала, а всякие хуеты типа попока наизусть знают :D
на сайте php.net есть официальнйы мануал, читай все там, там все красиво описано, с примерами дажеСпустя 10 сек.*поповаСапожник без сапог -
15 апреля 2010 г. 20: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 -
18 апреля 2010 г. 11: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 которые помогут решить данный вопрос с выводом дерева по частям? Спс -
18 апреля 2010 г. 12:10, спустя 14 минут 17 секунд
проблема решена :) использовал функции xpath для определения позиции
$res->xpath("//li[@id=$id]/bi[position() >= 5 and position() <= 10 ]")
Пожалуйста, авторизуйтесь, чтобы написать комментарий!