Господа програмисты столкнулся с такой задачей как парсинг XML. Посылается на отдаленный сервер GET запрос с необходимой информацией и возвращает некий XML код HTML: <site> <people> <login>вася</login> <sex>1</sex> <date_registration>23.02.2010</date_registration> </people> <people> <login>надя</login> <sex>0</sex> <date_registration>12.03.2010</date_registration> </people> <people> <login>admin</login> <sex>1</sex> <date_registration>01.01.2000</date_registration> </people> </site> Нужно этот код получить и обработать после чего все записать в соответствующем порядке в базу данных. после чего вывести его пользователю. Подскажите в каком направлении следует капать? с помощью каких функций это реализируется? если не сложно приведите какойнибудь простенький пример. Я хочу научится =)
Загуглил ничего хорошего не нашел... все рассказывают о XML что такое и с чем едят и примеры создания на яваскрипте... нашел что то похожее для php но там нужна какая то функция типа domxml_open_mem() а она у меня не поддерживается может есть что то другое так что б подошли следующие библиотеки: php_sockets.dll php_xmlrpc.dll php_xsl.dll последнее может вообще не в тему но на XML похоже...
vuzy, пользуй SimpleXML он проще и начиная с пятой версии PHP входит в стандартный набор, т.е. доп. модули не нужны. PHP: <? $xml = simplexml_load_file('ссылка на сайт, откуда приходит XML'); $result = $xml->xpath('/people'); echo $result[0]['login']; // вася На самом деле $result не массив в плане is_array($result) == false, но ведёт себя похоже. Можно использовать с foreach. P.S. Не знаю, надо ли было написать ответ так: на самом деле $result итерабильный объект с ArrayAccess? [/img]
Такой умной фразы я бы не понял =) PHP: $result = $xml->xpath('/people'); как это понимать? Я понял что это закрывающий тег массива XML. Но как он работает? Может парсит все что находится между "родительскими" тегами Peolple?
vuzy если сервера твои, можно посылать что-нибудь другое кроме xml. например serialize array если нужно какой-то конкретный результат, лучше подойдут регулярки
в том то и дело что сервер не мой. Но они предоставляют вывод определенной публичной информации через XML. Я все таки добился определенного результата с помощью функций: PHP: <? require_once('bd.php'); $file=file_get_contents("некий xml запрос"); $xml=simplexml_load_string($file); $xml->username=mb_convert_encoding($xml->username, "Windows-1251", "UTF-8"); $xml->slogan=mb_convert_encoding($xml->slogan, "Windows-1251", "UTF-8"); $xml->about=mb_convert_encoding($xml->about, "Windows-1251", "UTF-8"); $xml->roomname=mb_convert_encoding($xml->roomname, "Windows-1251", "UTF-8"); $xml->racename=mb_convert_encoding($xml->racename, "Windows-1251", "UTF-8"); $xml->realname=mb_convert_encoding($xml->realname, "Windows-1251", "UTF-8"); $xml->city=mb_convert_encoding($xml->city, "Windows-1251", "UTF-8"); $xml->country=mb_convert_encoding($xml->country, "Windows-1251", "UTF-8"); $xml->aligTitle=mb_convert_encoding($xml->aligTitle, "Windows-1251", "UTF-8"); $update=time(); $sql="INSERT INTO haddan_user VALUES ()"; //впихнуть все в БД mysql_query($sql) or die (mysql_error()); //mysql_query($sql2) or die (mysql_error()); это тут не нужно закоментил что б не выдавало ошибку =) ?> структура файла заведомо известна. И поэтому довольно просто выбрать данные перекодировать их и внести в свою Базу данных. Единственное чего я не понял. Это то что используя функцию mb_convert_encoding сразу ко всему массиву XML он абсолютно ничего не выводит... а пот так поштучно перекодировать так он соображает =)
АП... Возник еще один вопрос.. как получить код ошибки из тэгов <site err="104" op="user"> <error> Неправильное имя персонажа или пароль </error> </site> как выудить это 104? для того чтоб прекратить выполнение скрипта если оно верно? а тоон так всю базу испортить может
эта функция выводит массив переменной XML мне нужно просто как то обратится к параметру "er" что бы проверить его значение можно даже не присылать готовый код объясните на пальцах..
PHP: <? if ($xml->site->@err==104) { //code } ?> будет рабоать? или лучше PHP: <? if ($xml->@err==104) { //code } ?>
Именно так. Знаешь, что интересно? Через неё можно увидеть способ добраться до нужного ключа. Почему ты в документацию не смотрел? Там примеры есть. Как-то так: PHP: <? $xml->attributes()->err
да вот посмотрел про симпл хмл с содержимым помог... а больше там ниочем не говорится.. Спасибо помогло.
такой вопрос.. пробовал старатся обойти массив в цикле с помощью xpath что б достать из people значение "логина" "пола" и "даты регистрации" но он мне ровным счетом ничего не выдает... PHP: <? $xmlcount=count($xml->people); $users=$xml->xpath('/people'); for($i=1; $i < $xmlcount; $i++) { echo $i; echo $users[$i][login]; echo ' - имя пользователя <br>'; } точнее выдает: Код (Text): 1 - имя пользователя 2 - имя пользователя 3 - имя пользователя 4 - имя пользователя как с помощью xpath обращатся то к дочерным элементам? по его имени =\\ или как перейти на следующий элемент people что бы продолжить??
Я ж писал: А ты for() используешь. Разные вещи. foreach() дёргает итератор, for() генерирует энное кол-во итераций. В PHP 5 луше использовать foreach() чаще. Это раньше for() был быстрее местами. upd к тому же: PHP: <? $xmlcount=count($xml->people); $users=$xml->xpath('/people'); WTF? Чего ты от этой конструкции ожидаешь? upd2 не могу понять, ёскель-моксель, документация тебе совсем не друг?
нет не друг я ее читал честно но там только какие то совсем ненужные функции ... и даже примеров нет а там где есть то на английском =)... коунтом я считаю сколько людей в списке а потом передаю это циклу и пока есть люди цикл пашет после чего перестает и выходит... Всеравно: PHP: <? foreach ($xml->people[0]->attributes() as $a=>$b) { echo $a.' - '; echo $b; выводит только атрибуты первого тэга people хоть с 0 хоть без него... пробовал делать переменную счетчик что б она всевремя добавлялась и выводила следующий элемент тоже не хочет может сделать что то вроде цикла фореач в цикле фор? тогда он точно выведет столько сколько надо =))) UPD: PHP: <? $file=file_get_contents('user.xml'); $xml=simplexml_load_string($file); $countxml=count($xml->people); $i=0; //$clans=$xml->xpath('/clan'); for ($s=0; $s<$countxml; $s++) { foreach ($xml->people[$i]->attributes() as $a=>$b) //foreach ($clans[0][name] as $a) { echo $a.' - '; echo $b; echo ' - имя пользователя<br>'; $i++; } } ?> выдает желаемый результат... а если внутри этого фореач организовать еще один то можно получить внутри 3 циклов еще и значение этих тэгов... а как сделать эо покороче ?? что б за 1 фореач обойти весь тэг people со всеми вложенными в него тэгами?
vuzy, ох, какой ты геморройный. С документаций да, хреного, но её надо учиться читать, какая бы не была. Плюс у доков иногда полезные комментарии. Ок. Давай с нуля? Ты получаешь содержание файла, суёшь содержание в SimpleXML. Кстати. можно так писать PHP: <? $xml = simplexml_load_file('user.xml'); Затем ты берёшь $xml->people и считаешь. НО. Ты неверно толкуешь подсчёт. Он неверный. Переменная $xml->people это то же самое, что $xml->people[0]. Понял смысл? $xml->people это обращение к первому элементу. Следовательно, считая его ты считаешь не количество тегов <people />. Не-а. Ты считаешь кол-во элементов внутри первого тега <people />! И их всегда будет три. То есть работоспособность твоего скрипта обманчива. Теперь про foreach(). Он вызывает объект итератор у класса SimpleXML. И проходит по каждому значению: PHP: <? foreach ($xml->people as $man){ echo $man->login.'<br />'; } /* вася надя admin */ Ок. Теперь заменим твой XML на такой (добавим атрибут): HTML: <site> <people> <login>вася</login> <sex>1</sex> <date_registration>23.02.2010</date_registration> </people> <people clan="Test"> <login>надя</login> <sex>0</sex> <date_registration>12.03.2010</date_registration> </people> <people> <login>admin</login> <sex>1</sex> <date_registration>01.01.2000</date_registration> </people> </site> И снова сделаем foreach(): PHP: <? foreach ($xml->people as $man){ echo $man->login.' ['.$man->attributes()->clan.']<br />'; } /* вася [] надя [Test] admin [] */ Теперь понял силу документации?
PHP: <? $xml = simplexml_load_file('user.xml'); Это понятно. Я уже научился... file_get_contents("") или simplexml_load_file('') одно и тоже. а ты видать не проверял ?? я посчитал количество тэгов в файле и получил ожидаемый результат в 109 штук после чего выполнил скрипт 109 раз и получил 109 разных записей в таблице =)) так что все верно у меня считает. а вот это реально круто =)) тоесть он пройдется по тэгам people назовет их $man и можно будет обратится к его элементам и атрибутам... Да сколняю голову перед силой документации но вот если бы она была написана по русски я бы понял это все гаразно раньше а так у меня в книге только пример с выше описанным гемороем =)))))))
Ты прав, не проверил. P.S. Документация раньше была почти вся на русском. После обновления php.net, ждём когда напереводят.
может ты уже знаешь я когда искал библиотеку (вчера) одну наткнулся на сайт http://www.php.su/functions/?count теперь от туда инфу черпаю =)
vuzy, все доки на русском устарели. Пользуйся, но поглядывай и на документацию на php.net. Например, прочёл про count() на русском, потом посмотри документацию на http://php.net/count флоппик, ага-ага? Там всё сырое, выкинутого с основного домена.
Костян Оно не просто "недопереведено", оно действительно во многих местах устарело. И выяснять эти места на собственном коде малоприятное занятие