Очень часто при написании скриптов мы сталкиваемся с использованием 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;

подробно о XML

Скрипты написаны в XHE 4.6.45 MT.

скачать скрипт

Добавить комментарий

*
*

Необходимые поля отмечены*