我需要将以下输入数组转换为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 id="123456">
<name>Vegi List</name>
<vegitables>
<vegitable id="5235632">
<url>Spinach</url>
</vegitables>
<vegitables id="5235633">
<url>Carrot</url>
</vegitables>
</vegitables>
</xml>
我正在考虑使用递归函数,但由于它是复杂的数组,我不知道正确的方法来处理它。
任何帮助将不胜感激!
由于
答案 0 :(得分:1)
这似乎有人将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>