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

Форум 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)
 

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