我需要将以下输入数组转换为xml。
输入数组:
$inputData = array (
'name' => 'xml',
'attr' => array(
'id' => 123
),
'children' => array(
array(
'name' => 'name',
'attr' => array(),
'children' => array(
'Vegi List'
),
),
array(
'name' => 'vegitables',
'attr' => array(),
'children' => array(
array(
'name' => "vegitable",
'attr' => array(
'id' => 456
),
'children' => array(
array(
'name' => "name",
'attr' => array(),
'children' => array(
"Spinach"
)
)
)
),
array(
'name' => "vegitable",
'attr' => array(
'id' => 789
),
'children' => array(
array(
'name' => "name",
'attr' => array(),
'children' => array(
"Carrot"
)
)
)
)
)
)
)
);输出XML:
<xml id="123456">
<name>Vegi List</name>
<vegitables>
<vegitable id="5235632">
<url>Spinach</url>
</vegitables>
<vegitables id="5235633">
<url>Carrot</url>
</vegitables>
</vegitables>
</xml>
我正在考虑使用递归函数,但由于它是复杂的数组,我不知道正确的方法来接近它。
任何帮助将不胜感激!
谢谢
这看起来像是有人将XML转换为特定的JSON格式,该格式保留了格式良好的XML(没有名称空间支持)的大多数节点信息。
您是对的,您将需要一个递归函数,但是XML格式并没有那么复杂。基本上,您有一个数组,它描述XML元素节点及其名称、属性和子节点。子节点是用于文本节点的字符串或用于元素节点定义的数组。
这种格式可以使用DOM轻松转换回XML。
function appendNode(DOMNode $parent, $nodeDefinition) {
$document = $parent instanceOf DOMDocument ? $parent : $parent->ownerDocument;
if (is_string($nodeDefinition)) {
// append string as text node
$node = $parent->appendChild(
$document->createTextNode($nodeDefinition)
);
} elseif (is_array($nodeDefinition)) {
// append array as new element
$node = $parent->appendChild(
$document->createElement($nodeDefinition['name'])
);
foreach ($nodeDefinition['attr'] as $name => $value) {
$node->setAttribute($name, $value);
}
foreach ($nodeDefinition['children'] as $childDefinition) {
// iterate child definitions and append them
appendNode($node, $childDefinition);
}
}
}
$document = new DOMDocument();
appendNode($document, $inputData);
$document->formatOutput = TRUE;
echo $document->saveXml();
输出:<?xml version="1.0"?>
<xml id="123">
<name>Vegi List</name>
<vegitables>
<vegitable id="456">
<name>Spinach</name>
</vegitable>
<vegitable id="789">
<name>Carrot</name>
</vegitable>
</vegitables>
</xml>