• Главная
  • Карта сайта
Не найдено

Створення XML файлів з масивів на PHP

Сьогодні мова піде про роботу з XML, а точніше про відправку даних PHP скриптів браузеру в форматі XML.

Відразу скажу, що готових рішень в цій області існує маса. Але написання власного скрипта займає не більше часу, ніж пошук і вивчення чужого варіанту. До того ж, додати нові функції в свій скрипт значно простіше.

Постановка задачі

Є PHP масив (може бути багатовимірним). Потрібно отримати xml рядок з даними з цього масиву.

трохи теорії

У дистрибутив PHP входить модуль XMLWriter , Який призначений для запису даних в XML форматі. Використовувати безпосередньо цей модуль в своїх скриптах не дуже зручно, тому що він підтримує тільки самі базові функції і перетворення масиву в цей формат «виливається» в кілька десятків рядків коду.

Тому ми напишемо власний клас (Array2XML), який буде представляти собою оболонку для XMLWriter 'а й вирішувати одну вузьку задачу - перетворювати PHP масив в XML формат.

Перш ніж переходити до коду класу покажу, як ним користуватися.

require_once ( 'Array2XML.php'); header ( 'Content-type: application / xml'); $ Data = array ( 'val1' => 111, 'val2' => '222', 'val3' => 333, 500, 'container' => array ( 'mystr' => 'test test', 'myobj' => array ( 'x' => 250, 'y' => 150, 'name' => 'objName'))); $ Converter = new Array2XML (); $ XmlStr = $ converter-> convert ($ data); echo $ xmlStr;

Як бачите, після підключення файлу з класом і установки заголовка (рядка 1, 3), ми оголосили масив з даними.

Зверніть увагу. Чи не для всіх елементів масиву явно задані імена ключів.

Після цього, ми створюємо об'єкт типу Array2XML () і викликаємо його метод convert. Як параметр цей метод отримує наш масив. Як нескладно здогадатися, після його виконання ми отримаємо XML документ з даними з масиву.

І відразу ж покажу скріншот сторінки з результатом роботи скрипта.

Думаю, принцип перетворення зрозумілий. Для кожного елемента масиву ми створюємо XML тег, назва якого збігається з ключем елемента в масиві. Всередину цього тега ми вставляємо значення елемента.

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

Єдина відмінність в назвах стосується елементів масиву, для яких явно не задані ключі. PHP надає їм порядкові номери, але число не можна використовувати в якості XML тега. Тому я додав до його номеру приставку «key». Краще, звичайно, ставити ключі для всіх елементів масиву явно.

Тепер переходимо безпосередньо до класу

class Array2XML {private $ writer; private $ version = '1.0'; private $ encoding = 'UTF-8'; private $ rootName = 'root'; function __construct () {$ this-> writer = new XMLWriter (); } Public function convert ($ data) {$ this-> writer-> openMemory (); $ This-> writer-> startDocument ($ this-> version, $ this-> encoding); $ This-> writer-> startElement ($ this-> rootName); if (is_array ($ data)) {$ this-> getXML ($ data); } $ This-> writer-> endElement (); return $ this-> writer-> outputMemory (); } Public function setVersion ($ version) {$ this-> version = $ version; } Public function setEncoding ($ encoding) {$ this-> encoding = $ encoding; } Public function setRootName ($ rootName) {$ this-> rootName = $ rootName; } Private function getXML ($ data) {foreach ($ data as $ key => $ val) {if (is_numeric ($ key)) {$ key = 'key'. $ Key; } If (is_array ($ val)) {$ this-> writer-> startElement ($ key); $ This-> getXML ($ val); $ This-> writer-> endElement (); } Else {$ this-> writer-> writeElement ($ key, $ val); }}}} // end of Array2XML.php

Перш за все, в конструкторі ми створюємо об'єкт типу XMLWriter. За допомогою якого, будемо виконувати всю рутинну роботу.

Тепер, зверніть увагу на метод convert (рядки 14-23). В якості єдиного параметра він отримує масив з даними.

Метод openMemory () починає запис нового XML документа.

startDocument - вставляє заголовок.

startElement ($ this-> rootName) - створює кореневої тег. За замовчуванням, використовується ім'я root, але його можна змінити.

Після цього, ми перевіряємо, чи є отримані дані масивом (рядок 18) і викликаємо метод getXML (рядки 33-47), який і виконує перетворення масиву в XML формат.

Розглянемо його докладніше. Алгоритм наступний:
1) обходимо в циклі масив;
1.1) якщо ключ поточного елемента є числом, додаємо до нього приставку «key»;
1.2) якщо поточний елемент є масивом:
1.2.1) створюємо відкриває тег, в якості назви використовуємо ключа даного елемента (рядок 39);
1.2.2) викликаємо метод getXML, а в якості параметра передаємо поточний елемент, тобто вкладений масив (рекурсія);
1.2.3) створюємо закриває тег;
1.3) створюємо тег для поточного елемента масиву (за допомогою методу writeElement)

Важливо. PHP дозволяє задати максимальну глибину рекурсії. І якщо глибина вкладеності масивів буде більше цього значення, то скрипт просто не буде працювати.

Крім того, клас містить методи, які дозволяють вказати версію XML, кодування і ім'я кореневого тега (setVersion, setEncoding, setRootName).

Як бачите, клас вийшов досить простий, але цілком працездатний 🙂

завантажити

Ви можете завантажити архів з цим прикладом .

PS Якщо у вас є аналогічне рішення буду радий обговорити 😉

Цікаво почитати:

оптимізація сайтів - єдиний спосіб вирватися в ТОП пошукових систем.
Хочете відпочити і розслабитися? Японський сад створить потрібний настрій.
Забудьте про CD болванках. DVD диски перевершують їх за всіма параметрами. dvd купить киев

Хочете відпочити і розслабитися?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью