Библиотека SimpleXML

May 4, 2010 by admin Комментировать »

Для работы со многими XML-документами нет необходимости погружаться в DOM, так как в РНР 5 существует и более простой, но довольно мощный инстру­мент— SimpleXML. Разработчики РНР утверждают, что слово simple (простой, легкий) означает "простой" не в смысле возможностей, а в смысле легкости его ис­пользования. Основная идея SimpleXML состоит в том, что каждое XML-дерево (т.е. каждый XML-документ) может быть конвертирован прямо в РНР-код. Это достигается путем превращения XML-дерева в РНР-объект.

Рассмотрим пример конвертации XML-текста в РНР-объект. Предположим, существует необходимость обработать XML-документ с данными о турах. XML-код файла tours .xml приведен в листинге 17.3.

Листинг 17.3. Фййл tourSiXmf

<tours> <tour id="l">

<destination>Crimea</destination>

<period>7</period>

<price>600</price> </tour>

<tour id="2">

<destination>Croatia</destination>

<period>7</period>

<price>8 0 0</price> </tour> </tours>

Для вывода на экран этих данных в HTML-формате можно написать следую­щий код.

<?php

Stours = siinplexml_load_file("tours.xml"):

foreach ($tours->tour as $tour) { echo "<p><b>Destination: " . 5tour->destination . "<br></b>";

echo "Period (days): " . Stour->period . "<br>"; echo "Price (USD): " . $tour->price . "</p>";

}

?>

Это на самом деле очень просто. Корневой элемент <tours> был в одно мгнове­ние преобразован в РНР-объект $tours, а вложенные элементы <tour> стали кол­лекцией, хранящейся в свойстве $tours->tour. При использовании SimpleXML, как и DOM, все XML-данные должны быть представлены в кодировке UTF-8. Рассмотрим некоторые функции SimpleXML. Все, что не войдет в данный список, может быть найдено по адресу: http: / /www.php.net/manual/ru/ref. simplexml.php.

функция simplexml_load_file()

Данная функция загружает XML из файла и конвертирует полученные данные в РНР-объект. Сокращенный формат записи функции следующий.

object simplexml_load_file ( string fileneime [, string class_name] )

Параметр filename означает имя XML-файла, который необходимо конверти­ровать в РНР-объект. а необязательным параметром class_name может быть имя класса, экземпляр которого должен получиться на выходе. Такой класс обязатель­но должен быть унаследован от встроенного класса SimpleXMLElement.

Так как пример использования функции без опционального параметра был рас­смотрен немного ранее, рассмотрим возможность расширения функционала SimpleXML с помощью второго параметра class_name.

Для этих целей можно написать самый обыкновенный класс с необходимыми функциями. В нашем примере это будет класс с одной единственной функцией — asStripped(), в задачи которой будет входить урезание всех тегов из XML и воз­врат только значений элементов без XML-разметки. Класс может выглядеть сле­дующим образом.

class MySimpleXML extends SimpleXMLElement { public function asStripped () {

return strip_tags($this->asXML());

}

}

В данном примере создается собственный класс MySimpleXML, который наследу­ется от встроенного класса SimpleXMLElement. Это значит, что для MySimpleXML будут доступны все методы родительского класса, в том числе и asXML (), в задачи которого входит возврат текущего элемента в виде обычной XML-строки. Подроб­нее этот метод будет описан ниже.

После того как класс создан, он может быть применен следующим образом.

<?php

class MySimpleXML extends SimpleXMLElement { public function asStripped () {

return strip_tags($this->asXML());

)

}

$tours = simplexml_load_file("tours.xml","MySimpleXML");

echo $tours->asStripped();

?>

В функции simplexml_load_f ile () в качестве второго параметра было пере­дано имя собственного класса, и объект $tours уже был возвращен не с типом SimpleXMLElement, как это делается по умолчанию, а с типом MySimpleXML. В ре­зультате выполнения данного кода на выходе будет получен следующий текст.

Crimea 7

600

Croatia 7

800

Как видно из результата, все значения остались на своих местах, в то время как теги бесследно исчезли.

Функция Simplexml_load_stnng()

Эта функция делает то же самое, что и siinplexinl_load_Eile (), только исход­ный XML получает не из файла, а из строки (например, из строковой переменной). Краткий формат записи следующий.

object simplexml_load_string ( string data [, string class_ncime ] )

Способы работы с функцией Simplexml_load_string () те же, что и с функцией simplexml_load_file().

Функция SimpleXMLElement- >asXML()

Метод SimpleXMLElement->asXML () возвращает текущий элемент в виде XML. Формат записи метода следующий.

string SimpleXMLElement->asXML ( void )

Это означает, что в виде XML-строки можно вернуть как весь исходный файл, так и какой-то конкретный элемент. Далеко не уходя от того же tours xml (листинг 17.3), рассмотрим вывод XML-строки только одного тура, т.е. первого элемента <tour> со вложенными элементами.

<?php

$tours = simplexml_load_file("tours.xml","MySimpleXML");

echo $tours->tour[0]->asXML();

?>

Ha выходе получится следующий результат, <tour id="l">

<destination>Crimea</destination>

<period>7</period>

<price>600</price>

</tour> функция SimpleXMLElement->children()

Данная функция возвращает SimpleXMLElement с дочерними элементами, если таковые имеются. Формат записи функции следующий.

SimpleXMLElement simplexml_element >children , void )

Пример использования. <?php

$tours = simplexml_load_file("tours.xml"),

if ($tours->children()) {

foreach ($tours->children() as $child) { echo $child->asXML() . "\n";

}

}

?>

Код, приведенный в данном примере, даст следующий результат. <tour id="l">

<destination>Crimea</destination>

<period>7</period>

<price>600</price>

</tour>

<tour id="2">

<destination>Croatia-s/destination>

<period>7</period>

<price>800</price>

</tour>

Другими словами, будут выведены только дочерние элементы для <tours> без корневого элемента.

Функция Simplexml_import_dom()

Эта функция обеспечивает интеграцию DOM с SimpleXML. Любой объект типа DOMNode может быть импортирован в SimpleXML, и работа с ним будет продолжена уже средствами этого расширения. Формат записи функции simplexml_import_ dom() следующий.

SimpleXMLElement simplexml_import_dom ( DOMNode node [, string class_name] )

Рассмотрим возможность интеграции DOM и SimpleXML на примере. <?php

$dom = new domDocument; $dom->load("tours.xml");

$tours = $dom->getElementsByTagName("tour");

foreach ($tours as $tour) {

$simple_tour = simplexml_import_dom($tour);

echo (string) $simple_tour->destination . "<br>";

}

?>

в начале примера создается объект типа DOMDocument, а в цикле foreach про­исходит импортирование данных из DOM в SimpleXML, и на экран выводятся дан­ные, полученные уже средствами SimpleXML. Необходимо заметить, что при им­порте данных из DOM также доступна опция class_name, с помощью которой можно использовать свое расширение возможностей SimpleXML.

Прежде ничего не было сказано об атрибутах элементов. В SimpleXML атрибуты элементов (такие как id в элементе <tour> нашего примера) так же легко доступ­ны, как и содержимое этих элементов. Для получения значения атрибута можно обратиться к нему, как к элементу массива. Рассмотрим пример.

<?php

$tours = simplexml_load_file("tours.xml");

if ($tours->children()) {

foreach (Stours->tour as $tour) { //Обращаемся к атрибуту echo (string) $tour[‘id’] "\n";

}

}

?>

В данном примере атрибут id текущего элемента выводится на экран с предва­рительным преобразованием типа в string. В этом нет прямой необходимости, но данная процедура все же желательна. В результате будет получен следующий текст.

1 2

Эти цифры являются значениями атрибута id.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты