XML+PHP Xpach помогите с извлечением данных

Bomber

Новичок
XML+PHP Xpach помогите с извлечением данных

Простите за наглость на форуме PHP+MySQL уже писал но подумал что модераторы разные =-)

Есть такой код PHP работы с XML

$xml = join('',file('export.xml'));
$xml = xmldoc ($xml);
$xml->xpath_init();
$ctx0 = xpath_new_context($xml);
$nodes0 = xpath_eval($ctx0,'//ware');
foreach($nodes0->nodeset as $node0)
{
$currentNews0['idprod'] = $node0->get_attribute('idprod');
$news0[] = $currentNews0;
}


Есть такой XML (export.xml соттв.)
<subcatalog>
<catalog idcat="1" >
<ware idprod="1">
<text header="q1"></text>
<option id="1" text="111" desc="221"></option>
<option id="1" text="112" desc="222"></option>
</ware>
<ware idprod="2">
<text header="sds"></text>
<option id="2" text="113" desc="222"></option>
</ware>
</catalog>
<catalog idcat="2">
<ware idprod="3">
<text header="sd"></text>
<option id="3" text="118" desc="222"></option>
</ware>
<ware idprod="4">
<text header="sd"></text>
<option id="4" text="119" desc="222"></option>
</ware>
</catalog>
</subcatalog>
А теперь вопрос X-path считывает массивно !!! WARE тэги в массив $news0, как запихать текущую idcat тэга CATALOG. Я имею ввиду сущестует или есть у кого нибудь опыт записи в массив не сразу всех тэгов а по порядку с поиском (прикол в том что не это не описано в PHP4) Обьясню что последовательность в массиве должна быть $news0['id'] 1 1 2 2.
######################################################

Вот прошу помоч получить массив (можно двумерный) примерно такой
idprod idcat
1 -------- 1
2 -------- 1
3 -------- 2
4 -------- 2
Загвоздка в том что немогу цикл разобрать или остановить потому как считывается все в массив залпом (простите что повторяюсь от безысходности наверно) а в PHP ничего не документировано !!!
 

slach

Новичок
1) у тебя PHP4, переделаешь

2) идея такая
для php5 примерно так
if ($node0->ParentNode->nodeName() == 'catalog') {
$idcat0=$node0->parentNode->getAttribute('idcat');
}

3) если <catalog> все таки не родительская нода для ware, то можно пробежаться циклом типа
$p=$node0->parentNode;
while($p->nodeName() != 'catalog' && $p->parentNode!=null) {
$p=$p->parentNode;
}
if ($p->nodeName() == 'catalog') {
$idcat0=$p->getAttribute('idcat');
}


4) RTFM внимательно сюда http://php.net/manual/en/ref.domxml.php
для php4
http://php.net/manual/en/ref.dom.php
для php5

разберись вообще что же такое DOM

-~{}~ 13.07.06 10:03:

а вообще за кросс-постинг наверное можно было бы и в оффтопик тему снести
 

Bomber

Новичок
Автор оригинала: slach
1) у тебя PHP4, переделаешь

2) идея такая
для php5 примерно так
if ($node0->ParentNode->nodeName() == 'catalog') {
$idcat0=$node0->parentNode->getAttribute('idcat');
}

3) если <catalog> все таки не родительская нода для ware, то можно пробежаться циклом типа
$p=$node0->parentNode;
while($p->nodeName() != 'catalog' && $p->parentNode!=null) {
$p=$p->parentNode;
}
if ($p->nodeName() == 'catalog') {
$idcat0=$p->getAttribute('idcat');
}


4) RTFM внимательно сюда http://php.net/manual/en/ref.domxml.php
для php4
http://php.net/manual/en/ref.dom.php
для php5

разберись вообще что же такое DOM

-~{}~ 13.07.06 10:03:

а вообще за кросс-постинг наверное можно было бы и в оффтопик тему снести
slach спасибо за совет и за угрозы я все приму к сведенью =-)

-~{}~ 14.07.06 10:48:

slach тут вот какое дело! Может я туплю НО во всех примерах все считывается не блоками по родителям а массивно (или я че недопер ткни пальцем тогда) ну считывает все сначала родители в массив потом подродители в массив, а мне нужно что-бы считывалось блоками твой пример не катит, я даже не прошу за меня что-либо делать, я просто прошу подсказать ФУНКЦИЮ или идею как считать по блокам (всмысле пока опция тега idcat=1 и все в ней, потом пока idcat=2 и т.д. ), что такое DOM я прекрасно понимаю но без описалова с примерами функций я допереть немогу =-(
 

slach

Новичок
блин
какие нахер "блоки"
какое нахер "по-массивно"

XPath вырожение возвращает NodeSet - набор УЗЛОВ (в php4 оно в виде массива)

КАЖДЫЙ УЗЕЛ имеет ссылки на РОДИТЕЛьскую ноду (parentNode), родительский документ (ownerDocument), NextSibling (ищущий следом) и PreviouseSibling (идущий впереди) узлы
ссылки эти либо null либо ссылки на УЗЛЫ (на экземпляр класса DomNode)

ты что такое XPath понял?
а что такое предикаты в XPath?
//catalog[@idcat=1]
тебе о чем нибудь говорит?
 

Bomber

Новичок
Автор оригинала: slach
блин
какие нахер "блоки"
какое нахер "по-массивно"

XPath вырожение возвращает NodeSet - набор УЗЛОВ (в php4 оно в виде массива)

КАЖДЫЙ УЗЕЛ имеет ссылки на РОДИТЕЛьскую ноду (parentNode), родительский документ (ownerDocument), NextSibling (ищущий следом) и PreviouseSibling (идущий впереди) узлы
ссылки эти либо null либо ссылки на УЗЛЫ (на экземпляр класса DomNode)

ты что такое XPath понял?
а что такое предикаты в XPath?
//catalog[@idcat=1]
тебе о чем нибудь говорит?
Да не злись ты ! Я все уже сделал оказалось гораздо проще ! Но за помощь огромное чоловеческое спасибо =-) !
 

slach

Новичок
ну не злись дык не злись
ты тож зла не держи, сделал? молодец
 
Сверху