XML-функции в PHP. Парсинг только определенных тегов.

shp

Guest
XML-функции в PHP. Парсинг только определенных тегов.

Есть ли функции, позволяющие установить обработчики событий только для определенных тегов? То есть, чтобы парсились только эти тэги, а остальной текст просто выводился на страницу?
 

Orlis

Guest
Решить вашу задачу конечно можно (она актуальна для всех веб-проектов в мире :)), но для этого её нужно выразить на правильном языке.

XML не имеет функций и в нем нет тегов, но есть элементы, атрибуты и много чего еще (RTFM)

Для XSLT нужно написать правило по умолчанию (RTFM),
для ваших целей лучше подойдет SAX (RTFM)
 

shp

Guest
Автор оригинала: Orlis
XML не имеет функций и в нем нет тегов, но есть элементы, атрибуты и много чего еще (RTFM)
Я имелл ввиду: есть ли в PHP возможность парсить только определенные теги?
Для XSLT нужно написать правило по умолчанию (RTFM),
для ваших целей лучше подойдет SAX (RTFM)
Так XML-функции в PHP, назначающие обработчики событий, и реализует концепцию SAX. XSLT не всегда годится. Например, мне необходимо прочитать содержимое страницы из файла и ко всем изображениям добавить ссылку на их увеличенный просмотр (причем, только если увеличенное изображение существует и только, если версия документа - не для печати), а после всех ссылок - добавить определенное изображение. Как это реализуешь с помощью XSLT?
Я назначил функции-обработчики событий - и все дела. С другой стороны - даже такой простой парсинг выполняется медленнее, чем простой инклюд/чтение этого файла. Для файла размером 90 Кб генерация страницы выполняется за 0.6 - 1 сек. Я считаю, что это достаточно много, хотя и удобно. Поэтому я и думаю - можно ли это как-то оптимизировать.:confused:
Кстати, по идее, если файл большой - лучше открыть его и прочитать (
PHP:
echo fread (...);
), а не инклюдить? Или я не прав?
 

neko

tеam neko
так можно как-нить это покороче без генераций всяких

допустим есть SAX парсер
что мешает в хандлере проверить имя тега, и тем самым работать только с определенными тегами?
 

shp

Guest
Автор оригинала: neko
так можно как-нить это покороче без генераций всяких
Под генерацией я имел ввиду "сборку" готовой страницы. Поскольку в остальном ничего ресурсоемкого в этом скрипте не производится, основную часть этих 0.6-1 сек занимает как раз парсинг XML-файла. А сам вывод осуществляется в функциях-обработчиках.
допустим есть SAX парсер
Насколько я понимаю, суть модели SAX - вызов определенного кода при наступлении каких-либо событий. Т.е., функции xml_set_element_handler ... и т.д. в PHP как раз и реализуют модель SAX.
что мешает в хандлере проверить имя тега, и тем самым работать только с определенными тегами?
В смысле - в хандлере?
 

neko

tеam neko
для понимания смысла, перечитай свой пост ;-)

честно говоря я так и не понял с чем у тебя проблемы
 

shp

Guest
Сейчас поясню. В данном случае я однозначно буду хранить содержание страницы в виде XML, а в скрипте - парсить все это, так как это удобно, и сами XML-файлы - небольшого размера.
Вопрос заключается в повышении производительности парсинга, на случай использовании этого подхода в более серьезных приложениях, где производительность более критична.
Я просто назначил функции-обработчики с помощью xml_set_element_handler... ну в общем, процедура стандартная. А в этих функциях производится проверка: если, допустим, имя тэга - img, то выполняем такой-то код, а по дефолту - просто выводим тэг и все его атрибуты. При этом вызов функций-обработчиков производится для каждого тэга.
Так вот: можно ли в PHP производить вызов обработчиков, только когда встречается, допустим, тэг img? А все остальные данные просто выводить без всякого анализа. По идее, в этом случае должна увеличиться производительность.

P.S. Преимущество хранения содержимого страницы в виде XML я уже называл: написать XHTML-файл проще, чем, допустим, вручную вставлять после каждой ссылки что-то типа <img ...>, или после изображения - ссылку на его увеличенную копию и т.д.
 

neko

tеam neko
я так думаю, что нельзя
поскольку это не имеет смысла
с таким же успехом можно оттрансформировать документ, выкинув из него все не img теги

более того у меня сложилось впечатление, что все что тебе нужно это не собственные настройки над sax, а обычная xsl трансформация
 

Span

Новичок
Автор оригинала: shp
Я имелл ввиду: есть ли в PHP возможность парсить только определенные теги?

XSLT не всегда годится. Например, мне необходимо прочитать содержимое страницы из файла и ко всем изображениям добавить ссылку на их увеличенный просмотр (причем, только если увеличенное изображение существует и только, если версия документа - не для печати), а после всех ссылок - добавить определенное изображение. Как это реализуешь с помощью XSLT?
Ну как, как. XSLT это правила трансформации одного дерева в другое. Соответсвенно в твоем случае надо грамотно организовывать входные xml данные, включать в них больше информации, например, информацию о картинках.
 

shp

Guest
Автор оригинала: neko
я так думаю, что нельзя
поскольку это не имеет смысла
с таким же успехом можно оттрансформировать документ, выкинув из него все не img теги

более того у меня сложилось впечатление, что все что тебе нужно это не собственные настройки над sax, а обычная xsl трансформация
C XSL/XSLT я как раз и разбираюсь :). Кроме того, можно попробовать реализовать SAX на Perl. Кстати, а в PHP4 есть поддержка Pecl? Или только в PHP5?

Автор оригинала: Span
Ну как, как. XSLT это правила трансформации одного дерева в другое. Соответсвенно в твоем случае надо грамотно организовывать входные xml данные, включать в них больше информации, например, информацию о картинках.
Инфа о картинках там и так есть. Нет, когда просто преобразование XML-я в HTML - конечно, можно и одной XSLT-трансформацией обойтись. Но в моем случае необходимо проверять, существует ли такой файл, версию документа - обычная или для печати. Соответственно, логику на XSLT никак не переложишь.
Вообще-то - это все надо, когда большие объемы данных парсятся. А у меня размер файлов - 4-5 Кбайт. Так что пока производительности хватает;)
 

Orlis

Guest
XSLT это язык трансформации данных в формате XML в произвольный формат

на XSLT вполне можно переложить ВСЮ логику генерации страницы (у меня файлы на 100-500к (в сумме) - время генерации - десятые доли секунды)
 

slach

Новичок
Orlis ??? сколько сколько ??? 500 кб ??? за десятые доли секунды ??
ВСЯ ЛОГИКА в XSLT ????

какой XSLT процессор?
какая аппаратная платформа ?
что подразумевается под "ВСЯ ЛОГИКА" ?
какой язык ? php ?
 

shp

Guest
Нет, я согласен, что в XSLT можно реализовать логику. Но в моем случае все равно без проверок средствами PHP не обойтись. Как ты проверишь из XSL-файла, существует ли на винте файл с таким-то именем? Как проверишь, например, значение $_GET['version']? Всю логику на XSL не переложишь... Это все равно что пытаться связать JavaScript c PHP в реальном времени:)
Автор оригинала: Orlis
на XSLT вполне можно переложить ВСЮ логику генерации страницы (у меня файлы на 100-500к (в сумме) - время генерации - десятые доли секунды)
Подозрительно маленькие цифры:cool: Как ты такого добился, интересно? У меня, например, инклюд файла размером 90 килов производится за 0.2-0.3 сек. Только инклюд, безо всякого парсинга (PHP4 + Apache + WinXP).
 

Span

Новичок
Версия документа это не проблема. В зависимости от нее грузи разный XSLT файл.

Просблему с картинками можно попробовать решить с помощью DOM XML. Ты можешь создать Dom Document из своего xml, найти в нем все адреса картинок, проверить их, а трансформацию оставить на xslt. В общем используй DOM он и тэги только определенные выбирать умеет, чего ты вроде в самом начале добивался =)
 

Orlis

Guest
Как ты проверишь из XSL-файла, существует ли на винте файл с таким-то именем? Как проверишь, например, значение $_GET['version']?
http://ru.php.net/xslt-set-scheme-handlers

комментарий от 20-Mar-2003 -- этого мне оказалось достаточно, чтобы написать ВСЮ ЛОГИКУ интернет-магазина на XSLT
 

slach

Новичок
;)) Orlis так и говори
через call-back
логика тут не на XSLT
а частично на XSLT частично на php
так что pureXSLT тут и не пахнет =)
 

Orlis

Guest
я не вижу бизнес-логики в вызове десятка тривиальных функций типа:

function onXmlReadable($filename) { return xmlBoolean( is_readable($_SERVER['DOCUMENT_ROOT'].'/'.$filename) ); }
 

shp

Guest
2 Orlis. Во-первых, большое спасибо за ссылку (как говорится, лучше поздно, чем никогда)! И еще. Обработчик get_all, я так понимаю, вызывается из любого места xsl-документа. Ты не разобрался случаем, как вызывать обработчики open, get, put и close? Подскажи пожалуйста, если знаешь.
 

Orlis

Guest
Обработчик 'get_all' вызывается в том случае, когда ты указал неизвестную схему (не 'php:','http:','file:'), что делают остальные я не интересовался, так как 'get_all' работает, как часы.

Раз кто-то заинтересовался конкретно, привожу реальный код:

PHP:
	xslt_set_scheme_handlers($xh, array('get_all' => 'onXsltSchemeHandler'));
PHP:
function onXsltSchemeHandler($xh, $scheme, $param)
{
	$param = substr($param,1); // remove the first '/' automatically added by the engine
	$function = 'onXml' . ucfirst(strtolower($scheme)); //в принципе необязательно, так как вызов функции в PHP не case-sensitive

	$result = function_exists($function) ? $function($param) : NULL;

	return $result ? $result : xmlBoolean();
}

define ('PROLOG', '<'.'?xml version="1.0" encoding="UTF-8"?'.'>');
function xmlBoolean( $boolean = false )
{
	return PROLOG.($boolean ? '<true/>' : '<false/>');
}
Пример XSL кода, для вызова вышеупомянутой ф-ции:

Код:
		<xsl:if test="document(concat('readable:',$картинка))/true">
			<xsl:value-of select="$картинка"/>
		</xsl:if>
code]
 

si

Administrator
Кроме того, можно попробовать реализовать SAX на Perl. Кстати, а в PHP4 есть поддержка Pecl? Или только в PHP5?
1 - что за бред ?
2 - перл тут причем ?
3 - что такое pecl знаем ?
4 - PHP5 оставим в покое.
 
Сверху