Сен 30
PHP и XML
icon1 Snowcore | icon2 XML, php | icon4 09 30th, 2008| icon39 Comments »

Продолжаю свою подготовку к Zend exam. Zend Certification Study Guide (могу поделиться, кому нужно :), текущая тема - XML and Web Services.

PHP 5 предоставляет отличные средства для работы с XML документами. Одной из этих библиотек является SimpleXML.
Все объекты, созданные SimpleXML, являются экземплярами класса SimpleXMLElement. Рассмотрим на примере загрузку XML документа. У нас есть XML файл с информацией о продуктах в магазине следующего содержания (store.xml):

<?xml version=”1.0″ encoding=“UTF-8″ ?>
<store>
    <sku id=7705>
        <name>iPod classic</name>
        <price>330</price>
        <ean>0002520190555</ean>
    </sku>
    <sku id=1139>
        <name>ASUS A626</name>
        <price>310</price>
        <ean>0502770290391</ean>
    </sku>
    <sku id=783>
        <name>Sony iBook</name>
        <price>300</price>
        <ean>4506790441392</ean>
    </sku>
</store>

Загрузить XML документ можно несколькими способами. Первый способ предполагает использование функций simplexml_load_string и simplexml_load_file, которые возвращают объект SimpleXMLElement.

<?php
$xmlstr = file_get_contents(’store.xml’);
$store = simplexml_load_string($xmlstr);
?>
<?php
$store = simplexml_load_file(’store.xml’);
?>

Второй способ - использование конструктора объекта SimpleXMLElement.

<?php
$xmlstr = file_get_contents(’store.xml’);
$store = new SimpleXMLElement($xmlstr);
?>
<?php
$store = new SimpleXMLElement(’store.xml’, NULL, true);
?>

Пожалуй, самым интересным является последний способ. Загрузка XML через конструктор позволяет задать некоторые опции (второй параметр конструктора): все эти флаги начинаются на “LIBXML_”. При их помощи можно убрать пустые элементы (LIBXML_NOBLANKS), заменить entities (LIBXML_NOENT), отключить вывод ошибок и предупреждений (LIBXML_NOERROR), проверить загружаемый документ на валидность, используя DTD схему (LIBXML_DTDVALID) - подробное описание можно найти в мануале - глава “LXXVI. libxml Functions”.

После загрузки XML документа мы можем получить доступ к его элементам. Все элементы конвертируются в свойства объекта SimpleXMLElement, все атрибуты - в ассоциативный массив (имена элементов и атрибутов регистрозависимые):

<?php
foreach($store->sku as $sku)
{
 echo $sku[‘id’]  .‘<br />’;
 echo $sku->name  .‘<br />’;
 echo $sku->price .‘<br />’;
 echo $sku->EAN   .‘<br />’;
}
?>

Кроме этого SimpleXML предоставляет средства, при помощи которых можно узнать список всех элементов и атрибутов (и их имена).

SimpleXMLElement::children()
SimpleXMLElement::attributes()
SimpleXMLElement::getName()

Таким образом можно вывести XML, не зная имен элементов и атрибутов.

SimpleXML также позволяет выполнять запросы XPath (метод SimpleXMLElement::xpath(xpath_expression)). Данный метод возвращает массив элементов SimpleXMLElement. Например, мы можем получить названия всех товаров:

<?php
$productNames = $store->xpath(‘/store/sku/name’);
?>

или массив id всех товаров:

<?php
$productIDs = $store->xpath(‘/store/sku/@id’);
?>

Следует отметить, что XPath всегда возвращает массив объектов SimpleXMLElement (даже если результатом запроса является один элемент).

Изменение XML документа

В ранних версиях php (до 5.1.3), у SimpleXML не было возможности добавлять элементы и атрибуты в XML документы. Можно было только изменять существующие значения, но единственным способом добавления новых элементов и атрибутов было экспортирование SimpleXML объекта в DOM (используя функцию dom_import_simplexml). Добавление производится при помощи DOM (методы объекта DomDocument->create_element, DomDocument->create_attribute и др.). После этого DOM документ экспортируют обратно в SimpleXML (simplexml_import_dom). Согласитесь, не очень удобно.
С версией php 5.1.3 у SimpleXML появилось два новых метода SimpleXMLElement::addChild() и SimpleXMLElement::addAttribute().
Эти методы принимают 3 параметра - имя элемента (атрибута), его значение и пространство имен (опционально).
Рассмотрим на примере добавление нового продукта в наш документ store.xml:

<?php
$filename = ’store.xml’;
$store = new SimpleXMLElement($filename, NULL, true);
   
$newSku = $store->addChild(’sku’);
$newSku->addChild(‘name’, ‘Macbook Pro’);
$newSku->addChild(‘price’, ‘2400′);
$newSku->addChild(‘ean’, ‘1103610290850′);
    
$store->asXML($filename);
?>

В последней сроке используется метод SimpleXMLElement->asXML([filename]). Данный метод возвращает XML строку на основе текущего SimpleXMLElement, если определен параметр filename - то XML строка сохраняется в файл.

С XML можно работать при помощи DOM, но это будет рассмотрено уже в следующей статье.

Сен 12

Вот наткнулся на такое, позор! phpclasses.org не знает как правильно пишется Symfony!

Стыдно товарищи, стыдно!

Сен 11

Привет всем!
Я вернулся! Отпуск был отличным, да и вернулся я то давно - вот только сейчас добрался до блога.
Сменил работу наконец-то. На новом месте очень нравится - это то, чего я хотел!
Зарегистрировался в SAPE - заработок начался :-) Так как блог в кодировке UTF-8, то нужно также поменять кодировку ссылок, возвращаемых SAPE это очень просто:

1) Заменяем строку

$sape = new SAPE_client($o);

на

$o[’charset’] = ‘UTF-8′;
$sape = new SAPE_client($o);
unset($o);

2) Удаляем ‘links.db’.

А после этого спокойно зарабатываем денежку :)