Очень часто при написании скриптов мы сталкиваемся с использованием XML документов
и довольно регулярно наши клиенты интересуются как работать с XML в скриптах Human Emulator.
В связи с этим мы решили написать вводную статью на эту тему.
Более подробно про работу с XML Вы можете найти в мануалах по пхп, так как работа с XML в скриптах на php Хумана
полностью аналогична работе с XML в PHP.
Предположим у нас стоит задача вытянуть какие то данные из интернета в виде XML документа.
Для примера спарсим названия и описания фильмов с сайта kinogo.net в xml документ следующего формата:
Название фильма Страна Жанр Качество Перевод - и т.д.
Итак, для начала создаём тело скрипта:
<?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 документ :
// создаем соответствующий 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»
// страна
$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);
}
$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.
// считываем документ
$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
Примечание:
иногда промежуточный тег может быть написан через дефис, в этом случае используйте {}
пример:
$data->curname->{"name-tag"}->filename;
Скрипты написаны в XHE 4.6.45 MT.