Руководство по языку программирования PHP
 

PCRE
 

XML в PHP

Основы simpleXML

SimpleXML довольно простой и в тоже время довольно мощный способ обработки xml данных. Суть simpleXML заключается в том, что весь XML код конвертируется в PHP объект, что довольно сильно облегчает работу с ним. При работе с simpleXML все данные должны быть представлены в UTF-8 кодировке.

Чаще всего конвертация в PHP объект осуществляется при помощи функции simplexml_load_file, ниже представлены примеры работы с ним. Кроме того можно использовать функцию simplexml_load_string, создающую объект PHP из строки XML

Вначале создадим файл xml

<?xml version="1.0"?>
<cars>
<shop id="0">
<model>Volvo</model>
<year>2001</year>
<price>6000</price>
</shop>

<shop id="1">
<model>BMB</model>
<year>2009</year>
<price>17000</price>
</shop>
</cars>

Теперь выберем из него все данные

<?php
$smpl_xml=simplexml_load_file('auto.xml');
foreach ($smpl_xml->shop as $car){
echo "модель-".$car->model." год выпуска-".$car->year." цена-".$car->price."<br>";
}

?>

Результат:

модель-Volvo год выпуска-2001 цена-6000
модель-BMB год выпуска-2009 цена-17000

<?php
$smpl_xml=simplexml_load_file('auto.xml');
print_r($smpl_xml);

?>

Результат:

SimpleXMLElement Object ( [shop] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 0 ) [model] => Volvo [year] => 2001 [price] => 6000 ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1 ) [model] => BMB [year] => 2009 [price] => 17000 ) ) )

В следующем примере будет выведена только цена второго автомобиля.

<?php
$smpl_xml=simplexml_load_file('auto.xml');
$xml_node = $smpl_xml->shop[1];
echo $xml_node->price;

?>

или

<?php
$smpl_xml=simplexml_load_file('auto.xml');
echo ($smpl_xml->shop[1]->price);

?>

Результат:

17000

Для вывода сразу всего xml-кода или отдельного узла используется метод asXML().

<?php
$smpl_xml=simplexml_load_file('auto.xml');
echo $smpl_xml->shop[1]->asXML();

?>

Результат:

<shop id="1">
<model>BMB</model>
<year>2009</year>
<price>17000</price>
</shop>

simpleXML также поддерживает адресацию с помощью языка XPath. В следующем примере будут отобраны все узлы "year" и возвращен их массив.

<?php
$smpl_xml=simplexml_load_file('auto.xml');
$x=$smpl_xml->xpath("/cars/shop/year");
print_r($x);

?>

Результат:

Array ( [0] => SimpleXMLElement Object ( [0] => 2001 ) [1] => SimpleXMLElement Object ( [0] => 2009 ) )

Замена значений элементов осуществляется простым присвоением значения

<?php
$smpl_xml=simplexml_load_file('auto.xml');
$xml_node = $smpl_xml->shop[0]->price;
echo $xml_node;
$smpl_xml->shop[0]->price = '1245';
$xml_node1 = $smpl_xml->shop[0]->price;
echo "<br>".$xml_node1;

?>

Результат:

6000
1245

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

<?php
$smpl_xml=simplexml_load_file('auto.xml');
$smpl_xml->shop[0] = '1245';
print_r($smpl_xml);

?>

Результат:

SimpleXMLElement Object ( [shop] => Array ( [0] => 1245 [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1 ) [model] => BMB [year] => 2009 [price] => 17000 ) ) )

В двух предыдущих примерах был изменены данные xml находящиеся в оперативной памяти, но они не были записаны на диск. Для перезаписи данных в файле используется функция file_put_contents()

<?php
$smpl_xml=simplexml_load_file('auto.xml');
$smpl_xml->shop[0] = '1245';
print_r($smpl_xml);
file_put_contents('auto.xml',$smpl_xml->asXML());

?>

В результате содержимое файла auto.xml примет следующий вид:

<?xml version="1.0"?>
<cars>
<shop id="4">1245</shop>

<shop id="3">
<model>BMB</model>
<year>2009</year>
<price>17000</price>
</shop>
</cars>

Также допустима интеграция simpleXML и Dom при помощи функции Simplexml_import_dom()

<?php
$dom_xml=new domDocument;
$dom_xml->load("auto.xml");
$shops=$dom_xml->getElementsByTagName("shop");
foreach ($shops as $shop){
$simple_shop = simplexml_import_dom($shop);
print $simple_shop->model;
print "<br>";
}

?>

Результат:

Volvo
BMB

В этом примере будет показано как получить значение атрибутов элементов

<?php
$smpl_xml=simplexml_load_file('auto.xml');
foreach ($smpl_xml->shop as $shop){
print($shop['id'].'<br>');
}

?>

Результат:

0
1

 

Основы DOM
 

???????@Mail.ru