Створення XML файлів з масивів на PHP
Сьогодні мова піде про роботу з XML, а точніше про відправку даних PHP скриптів браузеру в форматі XML.
Відразу скажу, що готових рішень в цій області існує маса. Але написання власного скрипта займає не більше часу, ніж пошук і вивчення чужого варіанту. До того ж, додати нові функції в свій скрипт значно простіше.
Постановка задачі
Є PHP масив (може бути багатовимірним). Потрібно отримати xml рядок з даними з цього масиву.
трохи теорії
У дистрибутив PHP входить модуль XMLWriter , Який призначений для запису даних в XML форматі. Використовувати безпосередньо цей модуль в своїх скриптах не дуже зручно, тому що він підтримує тільки самі базові функції і перетворення масиву в цей формат «виливається» в кілька десятків рядків коду.
Тому ми напишемо власний клас (Array2XML), який буде представляти собою оболонку для XMLWriter 'а й вирішувати одну вузьку задачу - перетворювати PHP масив в XML формат.
Перш ніж переходити до коду класу покажу, як ним користуватися.
Як бачите, після підключення файлу з класом і установки заголовка (рядка 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 купить киев