Десериализация в XML
Для десериализации (декодирование) перевод XML
в объект PHP можно использовать PHP-функцию SimpleXMLElement()
. В переменной $xml
хранится объект с разобранным XML
. Обращаясь к свойствам этого объекта можно получать доступ с содержимому тегов XML:
$str = "<?xml version='1.0'?>
<worker>
<name>Коля</name>
<age>25</age>
<salary>1000</salary>
</worker>";
$xml = new SimpleXMLElement($str);
var_dump($xml); // { ["name"]=> string(8) "Коля" ["age"]=> string(2) "25" ["salary"]=> string(4) "1000" }
Если XML
хранится в файле или отдается по обращению к URL
, то следует использовать функцию simplexml_load_file
, которая делает тот же объект из xml
:
$xml = simplexml_load_file(путь_к_файлу_или_урл);
Из объекта xml в нормальный массив
Если неудобно работать с объектом xml
, можно преобразовать его в нормальный массив PHP с помощью следующего хитрого приема:
<?
$xml = simplexml_load_file(путь_к_файлу_или_урл);
var_dump(json_decode(json_encode($xml), true));
Приемы работы
Дан следующий XML:
<?xml version='1.0'?>
<worker>
<name>Коля</name>
<age>25</age>
<salary>1000</salary>
</worker>
Получим имя, возраст, зарплату работника:
<?
$xml = simplexml_load_file(путь_к_файлу_или_урл);
echo $xml->name; // выведет 'Коля'
echo $xml->age; // выведет 25
echo $xml->salary; // выведет 1000
Работа с атрибутами
Данные хранятся в атрибутах:
<?xml version='1.0'?>
<root>
<worker name="Коля" age="25" salary="1000">Номер 1</worker>
</root>
<?
$xml = simplexml_load_file(путь_к_файлу_или_урл);
echo $xml->worker['name']; // выведет 'Коля'
echo $xml->worker['age']; // выведет 25
echo $xml->worker['salary']; // выведет 1000
echo $xml->worker; // выведет 'Номер 1'
Теги с дефисами
В XML
разрешены теги и атрибуты с дефисом. В этом случае обращение к таким тегам происходит так:
<?xml version='1.0'?>
<root>
<worker>
<first-name>Коля</first-name>
<last-name>Иванов</last-name>
</worker>
</root>
<?
$xml = simplexml_load_file(путь_к_файлу_или_урл);
echo $xml->worker->{first-name}; // выведет 'Коля'
echo $xml->worker->{last-name}; // выведет 'Иванов'
Перебор циклом
Мы можем перебрать наш объект с помощью цикла foreach
:
<?xml version='1.0'?>
<workers>
<worker>
<name>Коля</name>
<age>25</age>
<salary>1000</salary>
</worker>
<worker>
<name>Вася</name>
<age>26</age>
<salary>2000</salary>
</worker>
<worker>
<name>Петя</name>
<age>27</age>
<salary>3000</salary>
</worker>
</workers>
<?
$xml = simplexml_load_file(путь к файлу или урл);
foreach ($xml as $worker) {
echo $worker->name; // выведет 'Коля', 'Вася', 'Петя'
}