|
|
|
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 |
|
|
|