парсинг xml

dj100gr

Новичок
парсинг xml

нужно парсить xml файл, в результате чего получить многомерный массив, использую скрипт из примера в учебнике
function readDatabase($filename)
{
$data = implode("",file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser,$data,$values,$tags);
xml_parser_free($parser);

foreach ($tags as $key=>$val)
{
if ($key == "big")
{
$myr = $val;
for ($i=0; $i < count($myr); $i+=2)
{
$offset = $yr[$i] + 1;
$len = $yr[$i + 1] - $offset;
$tdb[] = parseMyr(array_slice($values, $offset, $len));
}
} else {continue;}
}
return $tdb;
}

function parseMyr($mvalues) {
for ($i=0; $i < count($mvalues); $i++)
$m[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
return $m;
}

при парсинге вот такого файла
<xml>
<big>
<small1>текст1</small1>
<small2>
<s1>текст01</s1>
<s2>текст02</s2>
<s3>текст03</s3>
</small2>
<small3>текст2</small3>
<small4>текст3</small4>
</big>
.....
</xml>
все получается как надо, но вот не хватает мозгов на вот такой

<xml>
<big>
<small1>текст1</small1>
<small2><s>текст</s>текст2</small2>
<small3>текст3</small3>
<small4>текст4</small4>
</big>
.....
</xml>
в данном случае "текст2" скриптом игнорируется, а нужно проигнорировать то что находится в <s>...</s>
 

cDLEON

Онанист РНРСlub
Pigmeich
Ну плохой - не плохой.
В любом случае можно и на xml_parser написать толковый обработчик со своим функционалом. Только вот большинство ф-й для обработки нужно будет писать ручками.
 

dj100gr

Новичок
ispolzuy simpleXML www.php.net/simplexml
все примеры действуют также... для xml вида
<xml>
<big>
<small1>текст1</small1>
<small2><s>текст</s>текст2</small2>
<small3>текст3</small3>
<small4>текст4</small4>
</big>
.....
</xml>
"текст2" игнорируется :(
писать обработчик ручками с нуля нет времени... подскажите пжлста как справится вот с этим конкретным примером
 

phpdev2007

Новичок
Если хочешь посмотреть как работает твой пример, смотри через print_r что попадает в циклы, возможно пример просто игнорирует вложенные теги.
 

dj100gr

Новичок
вложенные не игнорирует
<small1>текст1</small1> попадает в массив
<s>текст</s> - тоже попадает

<small2><s1>текст5</s1><s2>текст6</s2></small2> - в таком примере попадают и <s1>текст5</s1> и <s2>текст6</s2>

косяк имеено во тут возникает - <small2><s>текст</s>текст2</small2> т.к. вложенные теги читаются а "текст2" вообще выпадает
 

dj100gr

Новичок
- штука полезная несомненно, но тут нет ошибки в скрипте, все дело в том что я не знаю как его усовершенствовать чтобы парсить такую штуку <small2><s>текст</s>текст2</small2>. Но похоже прийдется тратить недели 2 и писать свой парсер ручками с нуля, времени нет вот я помощи и просил.....
 

cDLEON

Онанист РНРСlub
Повторяю ещё раз.
Либо использывать что то вроде php_Dom, либо дописывать обработчики к xml_parser. Готового кода можете не ждать.

-~{}~ 28.11.07 16:15:

А ещё можете воспользоваться гуглем и найти то, что нужно вам.
 

Anpolimus

Новичок
Можно воспользоваться готовым.
Вот здесь http://www.keithdevens.com/software/xmlrpc/
Есть и описания
 

Pigmeich

Новичок
Anpolimus
А чем он лучше php_DOM?


все дело в том что я не знаю как его усовершенствовать чтобы парсить такую штуку <small2><s>текст</s>текст2</small2>.
У меня жуткое ощущение, что нужный Вам текст должен храниться в XML_Text или чего-то подобном, а эта вещь не является содержанием именновоного тега. Так что можно в этом направлении покопать.
 

cDLEON

Онанист РНРСlub
все дело в том что я не знаю как его усовершенствовать чтобы парсить такую штуку <small2><s>текст</s>текст2</small2>.
В ХМЛпарсере есть такая весч, как обработчик стороннего контента и есть обработчик начала тега и конца, вот после того, как вы напишете собственные обработчики для этих событий, у вас может получится отличный парсер)
 

dj100gr

Новичок
буду писать свой парсер, т.к. при использовании DOM наткнулся на ту же проблему. Pigmeich а можно чуть подробней что за XML_Text и как его поймать?
 

Pigmeich

Новичок
dj100gr
Это такой тип по стандарту. Туда как раз и попадает текст не окруженный тегами. В DOM типы называются по стандарту, потому он там есть. Вот.

Ты какую версию PHP используешь кстати? Под пятую DOM по другому сделан. А рекурсивный просмотр по детям должен давать все.
 

dj100gr

Новичок
Ты какую версию PHP используешь кстати? Под пятую DOM по другому сделан. А рекурсивный просмотр по детям должен давать все.
рекурсивный просмотр по детям действительно помог, вот только когда xml файл размером более 10 мег, вот тут то его использовать уже нереально... начал писать свой парсер используя обработчики начала и конца тагов.

всем большое спасибо!
 
Сверху