Создать XML-документ с помощью PHP простым способом

Я хочу построить XML-документ на PHP.

Я выбрал DOMDocument и знаю, что должен использовать такие методы, как createElement, createTextNode, appendChildи т.д., чтобы построить мой XML.

Вот как я сгенерировал XML только с одним узлом, содержащим информацию об автомобиле:

<?php
$doc = new DOMDocument ( '1.0', 'utf-8' );
$vehicles = $doc->createElement ( "Vehicles" );

$vehicle = $doc->createElement("Vehicle");
$vehicle_num = $doc->createElement("Number");
$vehicle_desc = $doc->createElement("Description");
$vehicle_year = $doc->createElement("Year");
$vehicle_make = $doc->createElement("Make");
$vehicle_model = $doc->createElement("Model");
$vehicle_color = $doc->createElement("Color");

$vehicle_num->appendChild($doc->createTextNode("AW2CM31Y8"));
$vehicle_year->appendChild($doc->createTextNode("2013"));
$vehicle_make->appendChild($doc->createTextNode("VOLKSWAGEN"));
$vehicle_model->appendChild($doc->createTextNode("NEW BEETLE"));
$vehicle_color->appendChild($doc->createTextNode("Black"));

$vehicle_desc->appendChild($vehicle_year);
$vehicle_desc->appendChild($vehicle_make);
$vehicle_desc->appendChild($vehicle_model);
$vehicle_desc->appendChild($vehicle_color);

$vehicle->appendChild($vehicle_num);
$vehicle->appendChild($vehicle_desc);

$vehicles->appendChild($vehicle);
$doc->appendChild ( $vehicles );

header ( "Content-type: text/xml" );
echo $doc->saveXML ();

Но что, если я захочу создать xml с, скажем, 100 узлами, содержащими не только информацию о транспортном средстве, но и другие узлы выше и ниже ее? Этот процесс был бы слишком трудоемким.

Итак, есть ли простой способ создания узлов и добавления значений к ним в XML с помощью PHP? Я обеспокоен количеством строк кода, которые я должен написать.

3 ответа

Решение

Первое, что приходит на ум, - это повторение кода. Возможно, вы хотите уменьшить это. Это можно сделать, переместив дублирующийся код в собственную функцию.

Чтобы сделать это быстро, в PHP есть замыкания. Давайте подстроим это:

У вас есть коллекция автомобилей, и у каждого автомобиля есть свойства и ценности. Таким образом, вы добавляете свойство в транспортное средство. КСТАТИ, createElement принимает текст уже как значение, так что вам не нужно создавать текстовые узлы. Итак, давайте обернем дублирующийся код в функции, а затем просто вызовем эти функции для создания XML. Это уже - через параметризацию - показывает вашу структуру. Просто различаются определения функций (первая часть) и их применение (вторая часть):

<?php
/**
 * Create XML Document with PHP in an easy way
 *
 * @link http://stackru.com/q/19702911/367456
 */

/**
 * @param DOMNode $node
 * @return DOMDocument
 */
$doc = function (DOMNode $node = NULL) {
    return $node ? ($node->ownerDocument ? : $node) : new DOMDocument();
};

/**
 * @param DOMElement $element
 * @param string $property
 * @param string $text
 * @return DOMElement the element the proeprty was added to
 */
$prop = function (DOMElement $element, $property, $text) {
    return $element->appendChild(
        $element->ownerDocument->createElement($property, $text)
    );
};

/**
 * @param DOMNode $element
 * @param string $name
 * @return DOMElement
 */
$element = function (DOMNode $element, $name) use ($doc) {
    return $element->appendChild(
        $doc($element)->createElement($name)
    );
};

Итак, после того, как все эти функции были определены, перейдем ко второй части:

$prop(
    $vehicle = $element(
        $vehicles = $element(
            $doc()
            , 'Vehicles'
        )
        , 'Vehicle'
    )
    , "Number"
    , "AW2CM31Y8"
);

$prop(
    $vehicle
    , "Year"
    , "2013"
);

$prop(
    $vehicle
    , "Make"
    , "VOLKSWAGEN"
);

$prop(
    $vehicle
    , "Model"
    , "NEW BEETLE"
);

$prop(
    $vehicle
    , "Color"
    , "Black"
);

И вуаля. Это выявило некоторую структуру. Дублирование кода также было удалено. Осталось только окончательно отразить результат:

header("Content-type: text/xml");
echo $doc($vehicles)->saveXML();

Если вы посмотрите на код, вы даже можете прочитать, что он буквально меняет структуру данных для создания XML. Следующим шагом будет использование некоторого вида обхода, но для этого нужно сначала определить структуру данных, а не только определение структуры кода, как это было сделано до сих пор (и которая уже должна быть полезной). для тебя).

Пример в сети: https://eval.in/59090

Мне кажется, что вы действительно ищете XML-сериализацию объекта с неким контролем над созданным в нем документом.

С этой целью вы можете посмотреть на проект XML Serializer - https://bitbucket.org/schmijos/xmlserializer

Который будет брать массив /PHP Object и сериализовать его в XML.

Я рекомендую вам создать xml с такой же структурой и использовать его в качестве шаблона. Так что вам нужно только заполнить этот XML.

Другие вопросы по тегам