PHP Работа с XML

XML DOM

В PHP за работу с XML в режиме DOM отвечает расширение (extension) domxml. В windows по умолчанию оно выключено. Чтобы его включить надо в php.ini раскомментировать строки extension=php_domxml.dll и extension=php_iconv.dll

Кроме того стоит скопировать все файлы из php/dlls в windows/system32

Чтобы создать пустой DOM в памяти для XML существует функция domxml_new_doc При этом в любом xml должен быть корневой элемент, который лучше создать сразу

Пример:

$dom = domxml_new_doc("1.0");

$xml_root = $dom->create_Element("RootElem");

$dom->append_Child( $xml_root );

Чтобы прочесть уже существующий используем функцию domxml_open_file. В случае неуспеха она вернет 0. Также существует функция domxml_open_mem для обработки xml уже находящегося в памяти

Пример:

$dom = domxml_open_file("file.xml");

$root = $dom->document_element();

if(!$dom)

echo "error";

Пример:

$dom = domxml_open_mem("<?xml version="1.0"?><rootelem><elem1/></rootelem>");

$root = $dom->document_element();

Записать содержимое dom в xml можно несколькими способами: dump_mem, dump_file. Также есть специальная функция для экспорта в html - html_dump_mem. dump_mem - позволяет кроме выбора форматирования задавать кодировку выходного файла. Она также удобна для обработки xml без временных файлов. В свою очередь dump_file позволяет задавать компрессию файла и пишет сразу на диск

Пример:

$xmlstr = $dom->dump_mem(1, "UTF-8");

file_put_contents("file.xml", $xmlstr); //Реализована в php5

echo $xmlstr;



//Эквивалент для php4

function file_put_contents_php ($location, $whattowrite) {

if (file_exists($location)) {

unlink($location);

}

$fileHandler = fopen ($location, "w");

fwrite ($fileHandler, $whattowrite);

fclose ($fileHandler);

}

Пример:

$dom->dump_file("file.xml",false, true);

Чтобы обратиться к элементам принадлежащим текущему узлу можно использовать функцию

Пример:

  $Child = $xml_page->first_child();

while($Child){

//...Do Something

$Child = $Child->next_sibling();

}

Клонирование ноды

При работе с dom из разных файлов нельзя присоединять node-ы одного файла к другому. Сначала ее надо клонировать. Для клонирования ноды существует метод clone_node. Чтобы скопировать ее содержимое: аттрибуты и детей достаточно задать при этом параметр true

Пример:

 //Добавить клонированную ноду со всем ее содержимым

$xml_parent->append_child($node->clone_node(true));

Перестановка нод

Поменять порядок нод в DOM XML можно при помощи функции insert_before.

Thanx to Alex Borodin

Пример:

 //Меняем порядок колонок Col Node1 и Node2

$dom = domxml_open_file(dirname(__FILE__)."/nodes.xml");
$children = $dom->get_elements_by_tagname("col");
$children1 = $children[0];
$children2 = $children[1];

//Собственно изменение позиций
$parent_node = $children1->parent_node();
$parent_node->insert_before($children2, $children1);
echo $dom->dump_mem(1);

Работа с XPath

Для работы с xml посредством языка поиска xpath в PHP реализованы функции xpath_new_context и xpath_eval, которые удобно скрыть в одну

Пример:

 //Получить все элементы record

$xpresult = xquery($dom, "//record");

if(!count($xpresult->nodeset))

echo "there is no records";

//Распечатать для найденых записей (record) значения аттрибута title

foreach ($xpresult->nodeset as $node)

{

echo $node->get_attribute("title");

}

function &xquery($Dom, $pattern)

{

$xP = xpath_new_context($Dom);

return xpath_eval($xP, $pattern);

}

Для работы с namespace есть мало документированная, но незаменимая функция xpath_register_ns

Пример:

 $xpath = xpath_new_context($Dom);

xpath_register_ns($xpath, \\'xml\\', \\'http://www.w3.org/XML/1998/namespace\\');

$xpresult = xpath_eval($xpath, "//label[@xml:lang=\\'ru\\']");