使用PHP以简单的方式创建XML文档


Create XML Document with PHP in an easy way

我想用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 中创建节点并为其添加值?我关心的是我应该写的代码行数。

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

为了快速做到这一点,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"
);

等等瞧。这揭示了一些结构。代码重复也已删除。剩下的唯一事情就是最终将结果呼应出来:

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

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

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

在我看来,

您真正要寻找的是对象的XML序列化,可以对其中创建的文档进行某种控制。

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

这将采用一个数组/PHP对象并将其序列化为XML。

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