使用PHP轻松创建XML文档

时间:2013-10-31 09:39:21

标签: php xml domdocument xml-generation

我想用PHP构建一个XML文档。

我选择了DOMDocument,我知道我必须使用createElementcreateTextNodeappendChild等方法来构建我的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 ();

但是,如果我想用100个节点构建一个xml,不仅包含车辆信息,还包含其上下的其他节点。这个过程太费力了。

那么,是否有一种简单的方法可以创建节点并使用php在xml中为它们添加值?我关心的是我应该编写的代码行数。

3 个答案:

答案 0 :(得分:1)

在我看来,你真正想要的是一个对象的XML序列化,它可以对其中创建的文档进行某种控制。

为此,您可能需要查看XMLSerializer项目 - https://bitbucket.org/schmijos/xmlserializer

将使用数组/ PHP对象并将其序列化为XML。

答案 1 :(得分:1)

首先想到的是你有代码重复。你可能想要减少它。这可以通过将重复的代码移动到它自己的函数中来完成。

为了快速做到这一点,PHP有关闭。让我们排成一行:

您拥有一系列车辆,每辆车都拥有属性和价值。因此,您要向车辆添加属性。顺便说一下,createElement确实将文本作为值,因此您不需要创建文本节点。因此,让我们将重复的代码包装到函数中,然后只需调用这些函数来创建XML。已经 - 通过参数化 - 显示了你的结构。只是功能的定义(第一部分)和那些(第二部分)的应用不同:

<?php
/**
 * Create XML Document with PHP in an easy way
 *
 * @link http://stackoverflow.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"
);

Et瞧。这揭示了一些结构。代码重复也已被删除。唯一剩下的就是最终回应结果:

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

如果你看一下代码,你甚至可以读到它确实颠倒了数据结构来创建XML。接下来就是利用某种遍历,但首先需要定义数据结构,而不仅仅是代码结构的定义,因为它到目前为止已经完成(并且应该已经使用过了)为你)。

在线示例:https://eval.in/59090

答案 2 :(得分:0)

我建议您创建具有相同结构的xml,并将其用作模板。所以你只需填写这个xml。