I live ExBB and CMS Limbo! » Форумы и сайты » Limbo CMS » Работа в Limbo с XML данными

Страниц (1): [1]
 

1. технарь - 8 ноября 2012 — 14:24 - перейти к сообщению
Работа с XML данными

Тут я буду разбираться с функциями, которые используются при работе с XML данными. Некоторые вещи объяснить будет сложно, а потому мне проще отталкиваться от конкретного примера. Не зная теории я буду использовать принцип черного ящика - подавать на вход данные и смотреть что получаю на выходе. Код буду обрамлять тегами Code, а данные вообще прятать под Spoiler ввиду большого размера...

Итак имеем на входе файл

Спойлер (Показать)

Создаем объект класса MiniXMLDoc. Через этот объект и будем оперировать данными
Следующей командой читаем в переменную $xml_data содержимое файла
code:
$xml = new MiniXMLDoc();
$xml_data=get_url('http://limbo/updates.xml');
2. технарь - 8 ноября 2012 — 14:42 - перейти к сообщению
Заполняем структуру объекта $xml данными из переменной $xml_data
По сути заполняем структуру данными из файла updates.xml.

code:
$xml->fromString($xml_data);

Спойлер (Показать)
3. технарь - 8 ноября 2012 — 15:04 - перейти к сообщению
Создаем в переменной $table_req вспомогательный массив, содержащий список элементов, которые мы хотели бы получить.
Другими словами в этом массиве перечисляем поля структуры, данные из которых нам нужно прочитать.

code:
$table_req = array (
'id'=>'id','name'=>'name','link'=>'link','published'=>'published','author'=>'author',
'version'=>'version','date'=>'date','authorEmail'=>'authorEmail','size'=>'size');
4. технарь - 8 ноября 2012 — 15:24 - перейти к сообщению
Сохраняем в переменной $table_data результат функции read_updates_xml
Эта функция получает данные из объекта $xml, ищет там категорию components и в этой категории ищет данные согласно списка, определенного в архиве $table_req

code:
$table_data = read_updates_xml($xml,'components',$table_req );

Спойлер (Показать)
5. технарь - 9 ноября 2012 — 00:08 - перейти к сообщению
Разбираем функцию read_updates_xml

Переменной $update_element присваиваем результат метода $xml->getElementByPath($path)
Этот метод ищет в объекте $xml секцию согласно адреса, указанного в параметре. В качестве параметра может быть имя секции, или конструкция разделённая слешем и описывающая родственные связи (раздел/подраздел и т.д.)
code:
$update_element = $xml->getElementByPath($path);

В случае, когда переменная $path = 'components' имеем ответ

Спойлер (Показать)
6. технарь - 9 ноября 2012 — 00:45 - перейти к сообщению
Присваиваем переменной $items результат метода $update_element->getAllChildren()
Этот метод возвращает список всех дочерних элементов объекта.

code:
$items = $update_element->getAllChildren();


В случае, когда $update_element получено при $path = 'components' имеем ответ

Спойлер (Показать)
7. технарь - 9 ноября 2012 — 13:01 - перейти к сообщению
Следующий код перебирает содержимое дочерних элементов
Там применяется метод getValue(), который получает всё текстовое содержимое отсекая все теги.
code:
foreach($items as $item)
{
$tinfo=false;
foreach($req as $var=>$val)
{
$obj = $item->getElementByPath($val);
if($obj)
{$tinfo[$var]=$obj->getValue();}
else
{$tinfo[$var]='';}
}
$info[]=$tinfo;
print_r( $tinfo ); ?><br /><br /><? ;
}
}
return $info;


Спойлер (Показать)
8. технарь - 15 ноября 2012 — 00:12 - перейти к сообщению
Наткнулся на интересную конструкцию...

code:
$xmlDoc = new MiniXMLDoc();
$xmlDoc->fromFile($this->install_dir . $p_file);
$islosinstall = &$xmlDoc->getElementByPath('mosinstall');

Похоже есть функция непосредственного чтения xml файла - fromFile

Powered by ExBB v1.1.180311