我想用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中为它们添加值?我关心的是我应该编写的代码行数。
答案 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。接下来就是利用某种遍历,但首先需要定义数据结构,而不仅仅是代码结构的定义,因为它到目前为止已经完成(并且应该已经使用过了)为你)。
答案 2 :(得分:0)
我建议您创建具有相同结构的xml,并将其用作模板。所以你只需填写这个xml。