我想用PHP构建一个XML文档。
我选择了 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 ();
但是,如果我想构建一个包含 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。