Очень часто при написании скриптов мы сталкиваемся с использованием XML документов
и довольно регулярно наши клиенты интересуются как работать с XML в скриптах Human Emulator.
В связи с этим мы решили написать вводную статью на эту тему.
Более подробно про работу с XML Вы можете найти в мануалах по пхп, так как работа с XML в скриптах на php Хумана
полностью аналогична работе с XML в PHP.
Предположим у нас стоит задача вытянуть какие то данные из интернета в виде XML документа.
Для примера спарсим названия и описания фильмов с сайта kinogo.net в xml документ следующего формата:
1 2 3 4 5 6 7 8 9 10 11 |
<data> <item> <film>Название фильма</film> <country>Страна</country> <type>Жанр</type> <quality>Качество</quality> <translate>Перевод</translate> <time>Продолжительность</time> </item> <item>и т.д.</item> </data> |
Итак, для начала создаём тело скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?php $xhe_host ="127.0.0.1:7004"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // ///////////////////////////// настройки скрипта ///////////////////////////////// // режим отладки $dbg = true; // путь к файлу с результатом $path = "res/"; // название документа $docname = "Документ"; // /////////////////// дополнительные модули ///////////////////// // функции require_once("tools/functions.php"); Далее переходим на сайт и спарсиваем нужные нам данные: // переходим на сайт $browser->navigate("http://kinogo.net/"); sleep($wt); // получим все названия фильмов $alltitles = $div->get_all_inner_texts_by_attribute("class","shortstorytitle"); //print_r($title); // получить все описания фильмов на странице $text = $div->get_all_inner_texts_by_attribute("class","shortimg"); for($i=0;$i<count($text);$i++) { // название фильма $titles = explode("\r\n", $alltitles[$i]); $title = array_pop($titles); // страна $country = get_string($text[$i], "Страна: ","\r\n"); // жанр $type = get_string($text[$i], "Жанр: ", "\r\n"); // качество $quality = get_string($text[$i], "Качество: ", "\r\n"); // перевод $translate = get_string($text[$i], "Перевод: ", "\r\n"); // продолжительность $time = get_string($text[$i], "Продолжительность: ", "\r\n"); } |
Теперь создаём XML документ :
1 2 3 |
// создаем соответствующий xml файл (если он не существует) if(!file_exists($path.$docname.".xml")) $textfile->add_string_to_file($path.$docname.".xml","<?xml version=\"1.0\" encoding=\"WINDOWS-1251\"?>"."\r\n<data>$docname\r\n</data>\r\n"); |
Разберем строку создания XML файла («шапка» любого XML файла)
<?xml version=\»1.0\ — версия XML (стандартная)
encoding=\»WINDOWS-1251\»?> — кодировка (обязательно указывать) , в нашем случае кодировка будет WINDOWS-1251
далее придуманные нами (для удобства) теги и название файла в теле документа с переносом строк
«\r\n<data>$docname\r\n</data>\r\n»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// страна $country = get_string($text[$i], "Страна: ","\r\n"); // жанр $type = get_string($text[$i], "Жанр: ", "\r\n"); // качество $quality = get_string($text[$i], "Качество: ", "\r\n"); // перевод $translate = get_string($text[$i], "Перевод: ", "\r\n"); // продолжительность $time = get_string($text[$i], "Продолжительность: ", "\r\n"); // записываем данные в xml документ $doc_str = "<item>\r\n<film>$title</film>\r\n<country>$country</country>\r\n<type>$type</type>\r\n<quality>$quality</quality>\r\n<translate>$translate</translate>\r\n<time>$time</time>\r\n</item>\r\n</data>\r\n"; $xml_data =$textfile->read_file($path.$docname.".xml"); $item1 = str_replace("</data>",$doc_str,$xml_data); file_write($path.$docname.".xml", $item1); } |
1 2 3 4 5 |
$doc_str - строка с данными, заключенными в придуманные нами теги (для удобства) + закрывающий тег Добавление данных происходит через замещение новым $doc_str закрывающего тега "</data>" $xml_data =$textfile->read_file($path.$docname.".xml"); - читаем текущие данные документа $item1 = str_replace("</data>",$doc_str,$xml_data); - делаем замену закрывающего тега на новые данные с закрывающим тегом! file_write($path.$docname.".xml", $item1); - перезаписываем данные |
Чтение XML (read_xml.php).
Теперь предположим, что собранный нами xml документ нужно где то опубликовать. Для этого его нам нужно сначала прочитать.
Для того, чтобы считать XML документ можно использовать функции класса SimpleXMLElement.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// считываем документ $xml = file_get_contents($path.$docname); // читаем как XML документ $ads = new SimpleXMLElement($xml); затем через цикл получаем все элементы дерева XML: foreach ($ads->item as $data) { // получаем данные $country = iconv("UTF-8", "Windows-1251",$data->country); $type = iconv("UTF-8", "Windows-1251",$data->type); $quality = iconv("UTF-8", "Windows-1251", $data->quality); $translate = iconv("UTF-8", "Windows-1251", $data->translate); $time = iconv("UTF-8", "Windows-1251", $data->time); debug_mess("$country $type $quality $translate $time"); } |
При этом доступ к данным полностью соответствует названию тэгов в xml документе.
Так, к примеру, что бы получить доступ к тэгу item мы используем конструкцию $ads->item,
а для того чтобы получить доступ к тэгу film $ads->item->film
Примечание:
иногда промежуточный тег может быть написан через дефис, в этом случае используйте {}
пример:
1 |
$data->curname->{"name-tag"}->filename; |
Скрипты написаны в XHE 4.6.45 MT.