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\\']");