1

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

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

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

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

4

3 回答 3

1

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

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

它将获取一个数组/PHP 对象并将其序列化为 XML。

于 2013-10-31T09:50:18.710 回答
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"
);

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

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

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

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

于 2013-10-31T10:15:42.060 回答
0

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

于 2013-10-31T09:49:11.193 回答