PHP

Работа с XML в PHP

Здравствуйте, уважаемые читатели, в этой статье "Работа с 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' />
Теги:
XML
Добавлено: 24 Сентября 2013 02:44:03 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...