Здравствуйте, уважаемые читатели, в этой статье "Работа с XML в PHP" я расскажу о том, как считывать, перезаписывать, удалять и производить php запись в xml файл. А так же о том, как в принципе быстро и удобно создать и поместить данные в xml разметку. Будучи студентом работая над своими проектами, я самостоятельно писал библиотеки для обработки XML документов. Я очень рад, что теперь мне не приходится пользоваться своими велосипедами т.к. есть готовые решения присутствующие в PHP по умолчанию.
Работа с XML в PHP – PHP запись в XML
Инструмент XMLWriter был создан специально для записи в XML формате. Один из важных его методов это startDocument(), который позволяет задать кодировку версии XML.
Попробуем создать простенький XML следующего вида:
<?xml version="1.0"?>
<Customer>
<id>1</id>
<name>Марк</name>
<address>Санкт-Петербург</address>
</Customer>
Получить такой формат можно с помощью XMLWriter таки вот образом:
<?php
//Простой пример
$xml = new XMLWriter(); //создаем новый экземпляр класса XMLWriter
$xml->openMemory(); //использование памяти для вывода строки
$xml->startDocument(); //установка версии XML в первом теге документа
$xml->startElement("Customer"); //создание корневого узла
$xml->writeElement("id", "1");
$xml->writeElement("name", "Марк"); //запись элемента
$xml->writeElement("address", "Санкт-Петербург");
$xml->endElement(); //закрытие корневого элемента
echo $xml->outputMemory(); //завершение записи в XML
?>
Как видите, Работа с XML в PHP, благодаря XMLWriter становится невероятно простой, и сильно облегчает задачи записи XML формата. Далее приведу маленький комплекс примеров о том, как осуществить, на php запись в xml. Например, задача поставлена – получить файл XML в следующем формате:
<xml version="1.0"?>
<purchase>
<customer>
<id>1</id>
<time>2013-04-19 10:56:03</time>
<total>0</total>
</customer>
<customer>
<id>2</id>
<time>2013-04-23 13:43:41</time>
<total>56</total>
</customer>
</purchase>
Чтобы получить такую структуру нужно выполнить ряд не хитрых методов класса XMLWriter.
<?php
$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument();
$xml->startElement("purchase");
$xml->startElement("customer"); //открытие элемента первого покупателя с ID = 1
$xml->writeElement("id", 1);
$xml->writeElement("time", "2013-04-19 10:56:03");
$xml->writeElement("total", "0");
$xml->endElement(); //закрытие элемента первого покупателя с ID = 1
$xml->startElement("customer"); //Открытие элемента второго покупателя с ID = 2
$xml->writeElement("id", 2);
$xml->writeElement("time", "2013-04-23 13:43:41");
$xml->writeElement("total", "56");
$xml->endElement(); //закрытие элемента первого покупателя с ID = 2
$xml->endElement();
echo $xml->outputMemory();
?>
Следующий пример покажет, как добавлять атрибуты к узлам XML дерева, согласитесь это довольно востребованная задача в проектах, где необходима работа с XML.
<?xml version="1.0"?>
<products>
<product pid="314">
<name>Яблоко</name>
<price>.00</price>
<discount>3%</discount>
</product>
<product pid="315">
<name>Манго</name>
<price>{EDIT_TEXT}.90</price>
<discount>3%</discount>
</product>
</products>
С помощью XMLWriter, делается это так:
<?php
$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument();
$xml->startElement("products");
$xml->startElement("product");
$xml->writeAttribute("pid", 314);
$xml->writeElement("name", "Яблоко");
$xml->writeElement("price", ".00");
$xml->writeElement("discount", "3%");
$xml->endElement();
$xml->startElement("product");
$xml->writeAttribute("pid", 315);
$xml->writeElement("name", "Манго");
$xml->writeElement("price", "{EDIT_TEXT}.90");
$xml->writeElement("discount", "3%");
$xml->endElement();
$xml->endElement();
echo $xml->outputMemory();
?>
Работа с XML в PHP – Чтение и получение данных из XML
Ниже будет приведен пример чтения и получения данных из XML с использованием классов XMLReader и SimpleXMLElement. Читать будем уже имеющийся XML объект, который мы создали в примере №1 при PHP записи в XML.
XMLReader используется для получения заданного узла из XML.
// Чтение XML формата
$rxml = new XMLReader(); //Создание элемента для чтения
$rxml->xml($nXML); //Загрузка XML, $nXML - строка в формате XML
//Переместиться к первому элементу customer
while($rxml->read() && $rxml->name !== 'customer');
$amountSpent = 0;
//Получим значение поля total у второго узла дерева
while($rxml->name === 'customer'){
//Чтение текущего дочернего через SimpleXMLElement
$node = new SimpleXMLElement($rxml->readOuterXML());
//Проверяем, номер элемента, если он равен 2 то это искомый элемент
if($node->id == 2){
$amountSpent = $node->total;
break;
}
//Переместиться к следующему элементу customer
$rxml->next('customer');
}
echo $amountSpent;
Часто задача возникает в получении данных из XML по значению, какого либо атрибута. Давайте по примеру №2 из раздела PHP запись в XML, получим название, цену и скидку продукта по его атрибуту pid = 315.
$rxml = new XMLReader();
$rxml->xml($nXML2);
while($rxml->read() && $rxml->name !== 'product');//Перемещаемся к первому продукту
$name = "";
$price = "";
$discount = "";
while($rxml->name === 'product'){
if($rxml->getAttribute("pid") == "315") //если pid = 315 то это искомый элемент
{
$node = new SimpleXMLElement($rxml->readOuterXML());//читаем значение элементов
$name = $node->name;
$price = $node->price;
$discount = $node->discount;
break;
}
$rxml->next('product'); //перемещаемся к следующему
}
echo "Продукт №315. Наименование: {$name}, цена: {$price} скидка: {$discount}";
Работа с XML в PHP – Добавление узлов дерева в существующий XML
Работая с XML в PHP, не редко приходится ломать голову над тем как добавить новый элемент в имеющуюся XML структуру. Используя XMLWriter и SimpleXMLElement сделать это очень легко:
//Добавим новый узел в имеющийся XML
$sXML = new SimpleXMLElement($nXML2); // загрузка в XML
$newchild = $sXML->addChild("product");
//Добавление параметров записи
$newchild->addAttribute("pid", 328);
$newchild->addChild("name", "Банан");
$newchild->addChild("price", ".00");
$newchild->addChild("discount", "0.3%");
echo $sXML->asXML();
Работа с XML в PHP – Перезапись элементов существующего XML
При активной работе с XML в PHP, приходится не только считывать и записывать элементы, но и редактировать имеющиеся. Перезапись существующего узла дерева XML может быть реализована следующим образом:
/**
* Перезапись узлов дерева XML формата.
*/
$productId = 314;
$parent = new DomDocument;
// создаем новый элемент дома product
$parent_node = $parent->createElement('product');
//Добавляем атрибут
$attribute = $parent->createAttribute("pid");
//устанавливаем значение
$attribute->value = $productId;
$parent_node->appendChild($attribute);
// Добавляем дочерний элементы
$parent_node->appendChild($parent->createElement('name', "Яблоко"));
$parent_node->appendChild($parent->createElement('price', ".00"));
$parent_node->appendChild($parent->createElement('discount', "1%"));
//Вставляем созданные элементы в создаваемый 'product'
$parent->appendChild($parent_node);
// Загружаем оригинальный XML формат
$dom = new DomDocument;
$dom->loadXML($nXML);
// Находим имеющийся элемент с pid = 314
$xpath = new DOMXpath($dom);
$nodelist = $xpath->query("/products/product[@pid={$productId}]");
$oldnode = $nodelist->item(0);
// Импортируем созданый ранее элемент в текущее дерево
$newnode = $dom->importNode($parent->documentElement, true);
// заменяем страрый элемент на новый
$oldnode->parentNode->replaceChild($newnode, $oldnode);
// сохраняем XML
echo $dom->saveXML();
Работа с XML в PHP – Удаление элементов XML
Из всего выше рассмотренного, осталась только одна операция, без которой данную статью о работе с XML в PHP , нельзя считать завершенной – это удаление элементов. Удаление элементов самое легкое из всей связки операций. Ну что же, ломать – не стоить, давайте удалим один из продуктов.
//Удаление продукта Манго
//загрузим оригинальный формат XML
$productId = 315;
$dom = new DomDocument;
$dom->loadXML($nXML2);
// Найдем элемент который необходимо удалить
$xpath = new DOMXpath($dom);
$nodelist = $xpath->query("/products/product[@pid={$productId}]");
$oldnode = $nodelist->item(0);
// Удаляем элемент
$oldnode->parentNode->removeChild($oldnode);
echo $dom->saveXML();
Закрыть текущий элемент (тэг) в xmlwriter
$xml->endDTDElement(); // закрыть текущий <tag attr='1' />