Войти

Показать полную графическую версию : Парсет XML для PHP


Страниц : [1] 2

Irlon
13-01-2006, 13:25
не люблю я xml всеми фибрами души, но нужно принимать экспортируемый xml файл в PHP.
Нашёл в PHP функцию xmlfree($XML_STR) – это то что мне нужно, создаёт ассоциативным массив с элементами. Но php ругается что нет такой функции, и в мануале по PHP даже описания её нету. Может существует аналог?

Vlad Drakula
13-01-2006, 13:31
Irlon


$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);



выдает:



Index array
Array
(
[PARA] => Array
(
[0] => 0
[1] => 2
)

[NOTE] => Array
(
[0] => 1
)

)

Vals array
Array
(
[0] => Array
(
[tag] => PARA
[type] => open
[level] => 1
)

[1] => Array
(
[tag] => NOTE
[type] => complete
[level] => 2
[value] => simple note
)

[2] => Array
(
[tag] => PARA
[type] => close
[level] => 1
)

)



а вообще зря вы не любите XML это очень хороший формат данных если им уметь правильно пользоваться!

Irlon
13-01-2006, 13:40
Спасибо! оперативно. Всё работает

Plutonium 239
31-05-2006, 16:07
Мне вот тут надо из xml файла погоду выбить,
<MMWEATHER>
<REPORT type="frc3">
<TOWN longitude="83" latitude="55" sname="%CD%EE%E2%EE%F1%E8%E1%E8%F0%F1%EA" index="29634">
<FORECAST weekday="4" predict="18" tod="3" hour="18" year="2006" month="5" day="31">
<PHENOMENA spower="0" rpower="0" precipitation="10" cloudiness="0" />
<PRESSURE min="747" max="749" />
<TEMPERATURE min="18" max="20" />
<WIND direction="2" max="5" min="2" />
<RELWET min="18" max="23" />
<HEAT max="20" min="18" />
</FORECAST>
<FORECAST weekday="5" predict="24" tod="0" hour="0" year="2006" month="6" day="1">
<PHENOMENA spower="0" rpower="0" precipitation="10" cloudiness="1" />
<PRESSURE min="746" max="748" />
<TEMPERATURE min="9" max="11" />
<WIND direction="3" max="5" min="2" />
<RELWET min="36" max="41" />
<HEAT max="11" min="9" />
</FORECAST>
<FORECAST weekday="5" predict="30" tod="1" hour="6" year="2006" month="6" day="1">
<PHENOMENA spower="0" rpower="0" precipitation="10" cloudiness="1" />
<PRESSURE min="746" max="748" />
<TEMPERATURE min="10" max="12" />
<WIND direction="2" max="3" min="1" />
<RELWET min="38" max="43" />
<HEAT max="12" min="10" />
</FORECAST>
<FORECAST weekday="5" predict="36" tod="2" hour="12" year="2006" month="6" day="1">
<PHENOMENA spower="0" rpower="0" precipitation="10" cloudiness="0" />
<PRESSURE min="746" max="748" />
<TEMPERATURE min="22" max="24" />
<WIND direction="3" max="5" min="2" />
<RELWET min="14" max="19" />
<HEAT max="25" min="23" />
</FORECAST>
</TOWN>
</REPORT>
</MMWEATHER>
Описание формата
TOWN информация о пункте прогнозирования:
index уникальный пятизначный код города
sname закодированное название города
latitude широта в целых градусах
longitude долгота в целых градусах
FORECAST информация о сроке прогнозирования:
day, month, year дата, на которую составлен прогноз в данном блоке
hour местное время, на которое составлен прогноз
tod время суток, для которого составлен прогноз: 0 - ночь 1 - утро, 2 - день, 3 - вечер
weekday день недели, 1 - воскресенье, 2 - понедельник, и т.д.
predict заблаговременность прогноза в часах
PHENOMENA атмосферные явления:
cloudiness облачность по градациям: 0 - ясно, 1- малооблачно, 2 - облачно, 3 - пасмурно
precipitation тип осадков: 4 - дождь, 5 - ливень, 6,7 – снег, 8 - гроза, 9 - нет данных, 10 - без осадков
rpower интенсивность осадков, если они есть. 0 - возможен дождь/снег, 1 - дождь/снег
spower вероятность грозы, если прогнозируется: 0 - возможна гроза, 1 - гроза
PRESSURE атмосферное давление, в мм.рт.ст.
TEMPERATURE температура воздуха, в градусах Цельсия
WIND приземный ветер
min, max минимальное и максимальное значения средней скорости ветра, без порывов
direction направление ветра в румбах, 0 - северный, 1 - северо-восточный, и т.д.
RELWET относительная влажность воздуха, в %
HEAT комфорт - температура воздуха по ощущению одетого по сезону человека, выходящего на улицу
Вот таким макаром я его открываю
$f = fopen('pogoda.xml', 'r');
$simple = fread($f, 10000);
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
а вот как из этих массивов вытащить информацию ума не приложу:wacko:

Vlad Drakula
31-05-2006, 16:27
Plutonium 239

читал: http://forum.oszone.net/thread-54773.html ???
не подходит???

benya
31-05-2006, 17:27
Irlon,

не люблю я xml всеми фибрами души

И верно ведь говорит Vlad Drakula зря не любите. Я только им и пользуюсь. Иногда небьльшие по обьему промежуточные данные скидываю в этот формат. И потом очень легко они оттуда и берутся.
Vlad Drakula,

читал: http://forum.oszone.net/thread-54773.html ???
не подходит???

Можно и просто парсером выдрать.

Vlad Drakula
31-05-2006, 17:44
benya
Можно и просто парсером выдрать.
можно... но вы веть прекрасно знаете что на много проще натравить на это дело XSL... и получить к примеру готовый HTML...
а главное 100% развезка PHP кода и представления... если нужно изменить внешний вид меняем XSL шаблон... если изменился входной формат XML просто меняем XSL шаблон...

Irlon
не люблю я xml всеми фибрами души
и зря!!! мой бывший коллега тоже не очень то любил... XSL... в итоге писал много всякой пакши на JS... а мне потом все это пришлось расхлебывать....

Plutonium 239
31-05-2006, 18:51
Vlad Drakula
а можно просто и понятно объяснить на моем примере? а то это все слишком сложно для меня...

Prisoner
31-05-2006, 19:24
Plutonium 239, в мануале (http://ru.php.net/xml_parse_into_struct) второй пример, имхо, как раз по твоей задачке. Погляди сам. Там идет "ручной" обход ввиду того, что xml_parse_into_struct возвращает данные не в DOM представлении, а как бы ссылочно.

benya
31-05-2006, 20:26
Vlad Drakula,

можно... но вы веть прекрасно знаете что на много проще натравить на это дело XSL... и получить к примеру готовый HTML...
а главное 100% развезка PHP кода и представления... если нужно изменить внешний вид меняем XSL шаблон... если изменился входной формат XML просто меняем XSL шаблон...


Смотря для какого случая легче. Для сайта который и написан, и оптимизирован под XML + XSLT действительно легче, ну и удобнее наверное. Добавить там самый минимум.
А так придется еще и движок для XSLT преобразования куда-то лепить со всеми вытекающими отсюда последствиями...

Vlad Drakula
31-05-2006, 22:02
benya
Смотря для какого случая легче. Для сайта который и написан, и оптимизирован под XML + XSLT действительно легче, ну и удобнее наверное. Добавить там самый минимум.
А так придется еще и движок для XSLT преобразования куда-то лепить со всеми вытекающими отсюда последствиями...
у меня сейчас есть коллега... он тоже так думал...

задача была похожая (индегрировать ленту новостей в сайт...) зделали без XSL...
потом дизайнер подправил дизайн + сменили формат...
в итоге за 15 минут переписали все снуля с использованием XSL...

Plutonium 239
01-06-2006, 04:48
Prisonerв мануале второй пример, имхо, как раз по твоей задачке.
я этот пример уже видел и ничерта в нем не понял, может есть какой другой способ обработать этот xml

vadimiron
01-06-2006, 12:26
а что для парсинга в ПХП никто не использует SimpleXML???

Вот и до меня дошла данная технология.............

Раз уж об ПХП и ИксЭмЭль зашла речь, то у меня вопрос: как лучше всего передавать параметры в XSL ??
Моя первая мысль (которая сейчас работает), создавать в генерируемом XML в руте ещё набор элементов params, потом из этих элементов создавать глобальные переменные и применять, где надо.
Задача конкретно: Я генерирую список объектов, у каждого объекта есть картинка, путь к папке со всеми картинками знает только сам ПХП скрипт, отсюда проблема, как этот путь узнает XSL. Этот путь я потом вставляю в <a href="{$path}/{$file_name}">...
Какие ещё мысли есть?

Vlad Drakula
01-06-2006, 12:44
vadimiron
на сколько я помню у вункции которая парсит есть тредтий агруемент, хеш массив параметров к преобразованию.

vadimiron
01-06-2006, 12:55
Vlad Drakula
Я использую вот так:

$xsltproc = new XsltProcessor();

$xsl = new DomDocument;
$xsl->load( XSL_DIR."/content_list.xsl");

$xsltproc->importStylesheet($xsl);

$xml_doc = DomDocument::loadXML($xml);

$html = $xsltproc->transformToXML($xml_doc);

Там нет больше ничего :(
Может ты имеешь в виду другой класс??

есть ещё функция $xsltproc->setParameter('', 'path', "C:\Temp");
но я не понимаю, как потом этот параметр вылавливать в XSL

Vlad Drakula
01-06-2006, 13:01
vadimiron

есть ещё функция $xsltproc->setParameter('', 'path', "C:\Temp");
но я не понимаю, как потом этот параметр вылавливать в XSL
наверное именно она, но я у себя использовал не классы а функции...

vadimiron
01-06-2006, 13:07
Vlad Drakula
А если ты передаёшь параметры, то как ты к ним потом в XSL обращаяшься???

Vlad Drakula
01-06-2006, 13:13
vadimiron
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="xml"/>
<xsl:param name="****"/>

заводит глобальную переменную...

benya
01-06-2006, 14:23
Vlad Drakula,
Я же говорю что для новичка в XSLT это тяжело понять. Куда впихнуть движок, как его применять + как преобразовывать + изчить хоть самые минимальные приемы для извлечения данных. Если знать как делать, то эти новости и за 10 мин. можно сдеать.

Vlad Drakula
01-06-2006, 15:15
benya
та вот учится нужно... все когданибуть бывает в первый раз...




© OSzone.net 2001-2012