Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Работа с XML


Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

PHP 5: Новые возможности.

The Pterodactyl

Copyright 2006 Pterodactyl's School

12.05.2006

История переиздания
Издание 1.00 [ Дата ]
Первоначальная версия.

Аннотация

Работа с XML документами в PHP 5 на примере использования SimpleXML Functions. Открытие, просмотр, изменение и сохранение данных.


Внимание

Для успешного изучения изложенного материала желательно наличие хотя бы поверхностного представления об XML.

Использование XML, в частности, при создании сайтов, приобретает все большее распространение. Естественно, что PHP обладает инструментами для работы с XML.

Еще в PHP 4 (и даже частично в PHP 3) для работы с XML файлами поддерживались технологии SAX и DOM (XML Parser Functions и DOM XML Functions соответственно). Однако, первая из них была весьма трудоемкой, а вторая требовала значительных ресурсов (памяти).

Замечание

В PHP 5 вместо DOM XML Functions включены DOM Functions.

В PHP 5 поддержка работы с XML была не только существенным образом обновлена, но и значительно расширена. В частности, поддерживаются SimpleXML Functions, которые мы вскоре рассмотрим подробнее, и XMLReader Functions. Включены также несколько экспериментальных расширений.

Замечание

Некоторые из перечисленных возможностей доступны начиная с версии PHP 5.1; некоторые требуют дополнительной активации.

Кроме того, широкие возможности для работы с XML предоставляют многочисленные пакеты PEAR.

Несомненными достоинствами данного расширения является простота его использования и доступность по умолчанию.

Существует три пути для создания объекта класса SimpleXMLElement.

Загрузка XML файла. Для создания нового объекта SimpleXMLElement из существующего файла используется функция simplexml_load_file().

$example = simplexml_load_file('example.xml');

Загрузка строки с XML кодом. Для создания нового объекта SimpleXMLElement из строки, содержащей XML код, используется функция simplexml_load_string().

$example = simplexml_load_string($example);

Импорт DomDocument объекта. Для создания нового объекта SimpleXMLElement из существующего объекта DomDocument (расширение DOM) используется функция simplexml_import_dom().

$example = simplexml_import_dom(new DomDocument);

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

Для понимания принципов работы с объектом достаточно знать следующие четыре простых правила [3].

  1. Переменные объекта указывают на набор одноименных элементов.
  2. Числовые индексы указывают на элементы.
  3. Строковые индексы указывают на атрибуты.
  4. Для доступа к текстовым данным используется преобразование к строковому (string) типу.

Доступ к наборам элементов. Корневой элемент XML документа в нашем примере содержит два элемента node. Одноименная переменная созданного объекта SimpleXMLElement представляет собой массив представлений элементов node и позволяет организовать их перебор.

var_dump($example);
object(SimpleXMLElement)#1 (1) {
  ["node"]=>
  array(2) {
    [0]=>
    object(SimpleXMLElement)#2 (2) {
      ["@attributes"]=>
      array(1) {
        ["id"]=>
        string(1) "1"
      }
      ["subnode"]=>

      string(3) "Foo"
    }
    [1]=>
    object(SimpleXMLElement)#3 (3) {
      ["@attributes"]=>
      array(1) {
        ["id"]=>
        string(1) "2"
      }
      ["subnode"]=>
      string(3) "Bar"
      ["comment"]=>
      string(15) "Just a comment."
    }
  }
}
            
foreach ($example->node as $node) {
    print_r($node);
}
            
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 1
        )

    [subnode] => Foo
)
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 2
        )

    [subnode] => Bar
    [comment] => Just a comment.
)
            

Подсказка

Обратите внимание на то, что элементы node также представлены объектами класса SimpleXMLElement.

Доступ к отдельным элементам. Доступ к отдельным элементам из набора возможен с помощью числовых индексов.

print_r($example->node[0]);
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 1
        )

    [subnode] => Foo
)
            
print_r($example->node[1]);
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 2
        )

    [subnode] => Bar
    [comment] => Just a comment.
)
            

Подсказка

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

print_r($example->node);
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 1
        )

    [subnode] => Foo
)
                
print_r($example->node[1]->comment);
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [foo] => bar
            [bar] => foo
        )

    [0] => Just a comment.
)
                

Доступ к атрибутам. Доступ к атрибутам элементов осуществляется с помощью строковых индексов.

print_r($example->node[1]['id']);
SimpleXMLElement Object ( [0] => 2 )

Доступ к текстовым данным. Как видно из предыдущих примеров, структура XML документа представлена серией вложенных друг в друга объектов класса SimpleXMLElement. Даже если мы, например, попытаемся получить доступ к дочернему элементу subnode первого элемента node, то также получим объект класса SimpleXMLElement (хотя в родительском объекте этот элемент представлен в виде строки).

var_dump($example->node[0]);
object(SimpleXMLElement)#4 (2) {
  ["@attributes"]=>
  array(1) {
    ["id"]=>
    string(1) "1"
  }
  ["subnode"]=>
  string(3) "Foo"
}            
print_r($example->node[0]->subnode[0]);
SimpleXMLElement Object ( [0] => Foo )

Для того, чтобы получить доступ непосредственно к текстовым (TEXT) данным, необходимо произвести преобразование к строковому типу.

print_r((string) $example->node[0]->subnode[0]);
Foo

Подсказка

Такое преобразование автоматически производится при выводе данных с помощью echo и print.

print $example->node[0]->subnode[0];
Foo
print $example->node[1]['id'];
2

Доступ к дочерним элементам. Доступ ко всем дочерним элементам данного элемента может быть получен с помощью метода children класса SimpleXMLExample.

foreach($example->node[1]->children() as $child) {
    print_r($child);
}
            
SimpleXMLElement Object
(
    [0] => Bar
)
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [foo] => bar
            [bar] => foo
        )

    [0] => Just a comment.
)            

Доступ ко всем атрибутам. Доступ ко всем атрибутам данного элемента может быть получен с помощью метода attributes класса SimpleXMLElement.

foreach($example->node[1]->comment[0]->attributes() as $attribute) {
    print_r($attribute);
}
            

SimpleXMLElement Object
(
    [0] => bar
)
SimpleXMLElement Object
(
    [0] => foo
)

            

После просмотра и изменения данных представляется логичным их сохранение. Такую возможность предоставляет метод asXML класса SimpleXMLElement. Причем, как легко догадаться, сохранен может быть не только весь документ целиком, но и отдельные его элементы - ведь они представлены такими же объектами.

$example->asXML('example.xml');

Метод asXML возвращает true, если документ успешно сохранен, и false в противнгом случае.

Подсказка

Если вызвать метод asXML без параметра, то, вместо сохранения, данные будут возвращены в виде строки.

print $example->node[1]->comment->asXML();
<comment foo="bar" bar="foo">It is just a dummy comment.</comment>

Created with DocBook Created with Libxslt


В избранное