Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбор XML :: свой парсер или сторонние разработки?
 
 автор: antf   (23.05.2008 в 10:18)   письмо автору
 
 

Здравствуйте. Мне нужен набор функций для выполнения следующих задач:

Преобразование xml-документа в массив.
Преобразование массива в xml-документ.
Выборка элемента по конкертному адресу (выборка содержимого 4 тега <image>, который в свою
очередь вложен в 3-й тег <item> ).

Знаю, что в php5 есть набор расширений для работы с xml. Однако php5 встречается не везде, выбранное расширение может быть не включено у конкретного хостера.Это нужно для gpl-разработок, где требуется совместимость с различными хостерами. Свой парсер будет точно универсальным, но уж очень заманчива идея не изобретать велосипед...

   
 
 автор: Trianon   (23.05.2008 в 11:17)   письмо автору
 
   для: antf   (23.05.2008 в 10:18)
 

Я тут как-то приводил пример. Можете взять код оттуда.

   
 
 автор: Trianon   (23.05.2008 в 11:27)   письмо автору
 
   для: Trianon   (23.05.2008 в 11:17)
 

upd. Где-то в следующих темах:
http://softtime.ru/forum/read.php?id_forum=1&id_theme=34820
http://softtime.ru/forum/read.php?id_forum=1&id_theme=35127
http://softtime.ru/forum/read.php?id_forum=1&id_theme=35334

   
 
 автор: antf_   (23.05.2008 в 22:36)
 
   для: Trianon   (23.05.2008 в 11:27)
 

<?xml version="1.0" encoding="utf-8" ?>
<blocks>
<block type="text" style="h1">
<content>Заголовок 1</content>
</block>
<block type="text" style="p_just">
<content>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam</content>
</block>
<block type="list" style="numeric" name="Нумерованный список">
<li>Первый пункт</li>
<li>Второй пункт</li>
<li>Третий пункт</li>
</block>
<block type="images" style="descr_in_bottom" in_row="3" rows_cnt="4" name="Изображения, описание снизу">
<image>
<minimg src="/images/min_01.jpg" />
<maximg src="/images/01.jpg" />
<alt>Фотография 1</alt>
<descr>Описание фотографии 1</descr>
</image>
<image>
<minimg src="/images/min_02.jpg" />
<maximg src="/images/02.jpg" />
<alt>Фотография 2</alt>
<descr>Описание фотографии 2</descr>
</image>
</block>
</blocks>

   
 
 автор: antf_   (23.05.2008 в 22:39)
 
   для: antf_   (23.05.2008 в 22:36)
 

Хотел бы сделать файловую версию AntfBlockeditor. В принципе, файловая версия у меня есть, но там жуткий формат: сериализация + разделители col1|||col2|||value3 Уже разработал xml-базу для хранения данных, думаю как ее распарсить:


<?xml version="1.0" encoding="utf-8" ?>
<blocks>
  <block type="text" style="h1">
    <content>Заголовок 1</content>
  </block>
  <block type="text" style="p_just">
    <content>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam</content>
  </block>
  <block type="list" style="numeric" name="Нумерованный список">
    <li>Первый пункт</li>
    <li>Второй пункт</li>
    <li>Третий пункт</li>
  </block>
  <block type="images" style="descr_in_bottom" in_row="3" rows_cnt="4" name="Изображения, описание снизу">
    <image>
      <minimg src="/images/min_01.jpg" />
      <maximg src="/images/01.jpg" />
      <alt>Фотография 1</alt>
      <descr>Описание фотографии 1</descr>
    </image>
    <image>
      <minimg src="/images/min_02.jpg" />
      <maximg src="/images/02.jpg" />
      <alt>Фотография 2</alt>
      <descr>Описание фотографии 2</descr>
    </image>
  </block>
</blocks>

   
 
 автор: Trianon   (23.05.2008 в 22:39)   письмо автору
 
   для: antf_   (23.05.2008 в 22:36)
 

и в чем проблема?

   
 
 автор: antf   (23.05.2008 в 23:11)   письмо автору
 
   для: Trianon   (23.05.2008 в 22:39)
 

Нашел код парсера на основе SAX в приведенных темах. Только он видит только атрибуты, но не видит содержимое тегов.


<?php

   error_reporting
(E_ALL);

   
$url "bbeditor.xml";
   
$res file_get_contents($url);

   function 
start_element($par$name$atr)
   {
       
$tmp = array('data' => '''name' => $name'atr' => $atr);

       global 
$heap$l = ++$heap['level']; $lp $l 1;
       
$heap['stack'][$l] = $heap['ref'];
       
$heap['ref'] = array('data' => '');
       if(!empty(
$atr)) $heap['ref']['atr'] = $atr;
   }
   function 
end_element($par$name)
   {
       global 
$heap$l = --$heap['level']; $ln $l 1;
       
$tmp $heap['ref'];
       
$heap['ref'] = $heap['stack'][$ln];
       unset(
$heap['stack'][$ln]);
       
$heap['ref']['sub'][$name][] =  $tmp;
   }
   function 
element_data($par$data)
   {
       global 
$heap;
       
$data trim($data);
       
//if('' != trim($data))
       //    $heap['ref']['data'].=iconv("utf-8", "windows-1251", $data);
   
}

   
$p xml_parser_create("");

   
$heap['level'] = 0;
   
$heap['ref'] = array();
   
xml_set_element_handler($p'start_element''end_element');
   
xml_set_character_data_handler($p'element_data');
   
xml_parse($p$res);
   echo 
'<pre>';
   
var_dump($heap);
?>

   
 
 автор: antf   (23.05.2008 в 23:15)   письмо автору
 
   для: antf   (23.05.2008 в 23:11)
 

Нужно ли подстраивать парсер под конкретные теги?

   
 
 автор: Trianon   (23.05.2008 в 23:21)   письмо автору
 
   для: antf   (23.05.2008 в 23:15)
 

не понял. А вот эта закоментаренная строчка
$heap['ref']['data'].=iconv("utf-8", "windows-1251", $data);
разве не содержимое тегов вытаскивает?

   
 
 автор: antf   (23.05.2008 в 23:28)   письмо автору
 
   для: Trianon   (23.05.2008 в 23:21)
 

Она перекодирует в utf-8. У меня на локалке не стоит, поэтому отключил.

   
 
 автор: Trianon   (23.05.2008 в 23:32)   письмо автору
 
   для: antf   (23.05.2008 в 23:28)
 

если бы Вы оставили её в таком виде
$heap['ref']['data'].=$data;
тогда да.

А так как у Вас - Вы просто заблокировали коллекцию данных тега. Вот их у Вас и не стало.

   
 
 автор: Trianon   (23.05.2008 в 23:26)   письмо автору
 
   для: antf   (23.05.2008 в 23:15)
 

парсер не нужно.
а вот этот код - придется.
$item = $out['ref']['sub']['RSS'][0]['sub']['CHANNEL'][0]['sub']['ITEM'];
   unset($out);
   $item = array_slice($item, max(0, count($item)-10));
   foreach($item as $k => $v)
   {
      $r = array();
      foreach($v['sub'] as $tag => $val) $r[$tag] = $val[0]['data'];
      $out[$k] = $r;
   }
   unset($item);
   echo '<pre>';
   print_r($out); 

ну собственно им решается задача, подобная этой
(выборка содержимого 4 тега <image>, который в свою очередь вложен в 3-й тег <item> )

   
 
 автор: antf_   (24.05.2008 в 08:48)
 
   для: Trianon   (23.05.2008 в 23:26)
 

Я подумал, что лучше написать индивидуальный парсер для каждого файла, чем SAX-ом заниматься: массив не такой громоздкий получится и код читабильнее.

   
 
 автор: Trianon   (24.05.2008 в 11:39)   письмо автору
 
   для: antf_   (24.05.2008 в 08:48)
 

И риск загнать ошибку в каждый из индивидуальных файлов.
Мне-то что... как нравится - так и пишите. :)

   
 
 автор: @ndry   (24.05.2008 в 10:22)   письмо автору
 
   для: antf   (23.05.2008 в 10:18)
 

simpleXML вам в помщь

   
 
 автор: Trianon   (24.05.2008 в 11:37)   письмо автору
 
   для: @ndry   (24.05.2008 в 10:22)
 

внимательно читаем самое первое сообщение в треде.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования