|
|
|
| Здравствуйте. Мне нужен набор функций для выполнения следующих задач:
Преобразование xml-документа в массив.
Преобразование массива в xml-документ.
Выборка элемента по конкертному адресу (выборка содержимого 4 тега <image>, который в свою
очередь вложен в 3-й тег <item> ).
Знаю, что в php5 есть набор расширений для работы с xml. Однако php5 встречается не везде, выбранное расширение может быть не включено у конкретного хостера.Это нужно для gpl-разработок, где требуется совместимость с различными хостерами. Свой парсер будет точно универсальным, но уж очень заманчива идея не изобретать велосипед... | |
|
|
|
|
|
|
|
для: antf
(23.05.2008 в 10:18)
| | Я тут как-то приводил пример. Можете взять код оттуда. | |
|
|
|
|
|
автор: 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>
|
| |
|
|
|
|
|
|
|
для: antf_
(23.05.2008 в 22:36)
| | и в чем проблема? | |
|
|
|
|
|
|
|
для: 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:11)
| | Нужно ли подстраивать парсер под конкретные теги? | |
|
|
|
|
|
|
|
для: antf
(23.05.2008 в 23:15)
| | не понял. А вот эта закоментаренная строчка
$heap['ref']['data'].=iconv("utf-8", "windows-1251", $data);
разве не содержимое тегов вытаскивает? | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2008 в 23:21)
| | Она перекодирует в utf-8. У меня на локалке не стоит, поэтому отключил. | |
|
|
|
|
|
|
|
для: antf
(23.05.2008 в 23:28)
| | если бы Вы оставили её в таком виде
$heap['ref']['data'].=$data;
тогда да.
А так как у Вас - Вы просто заблокировали коллекцию данных тега. Вот их у Вас и не стало. | |
|
|
|
|
|
|
|
для: 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-ом заниматься: массив не такой громоздкий получится и код читабильнее. | |
|
|
|
|
|
|
|
для: antf_
(24.05.2008 в 08:48)
| | И риск загнать ошибку в каждый из индивидуальных файлов.
Мне-то что... как нравится - так и пишите. :) | |
|
|
|
|
|
|
|
для: antf
(23.05.2008 в 10:18)
| | simpleXML вам в помщь | |
|
|
|
|
|
|
|
для: @ndry
(24.05.2008 в 10:22)
| | внимательно читаем самое первое сообщение в треде. | |
|
|
|