EDITED
我正在尝试将表单输入放入xml文件中。
正在搜索on this site I've found the following code,并用它来解析$ _POST内容。
经过几次尝试后,我意识到“数字标签”(由非关联数组产生)可能是我不成功的原因所以我修改了如下代码:
function array_to_xml(array $arr, SimpleXMLElement $xml, $NumK = false)
{
foreach ($arr as $k => $v) {
if (is_array($v)){
preg_match('/^0|[1-9]\d*$/', implode(array_keys($v)))
? array_to_xml($v, $xml->addChild($k), true)
: array_to_xml($v, $xml->addChild($k));
}else{
$NumK
? $xml->addChild('_'.$k.'_', $v)
: $xml->addChild($k, $v);
}
}
return $xml;
}
无论如何,我仍在与xpath命令“战斗”,因为我无法找到一些节点的GrandParent(来自非关联数组),我需要将其转换为重复的标签。
这是我试图遵循的逻辑:
1st - 查找要重新格式化的节点(唯一具有数字标签的节点);
第二 - 找到祖父母(我需要重复的标签);
第3步 - 用祖父母的标签替换祖父母(及其后代),为每组孙子(每个孩子一个)。
到目前为止,由于xpath的误解,我仍然坚持第一步。
下面是我的结果xml以及如何对其进行转换:
我的数组如下:
$TestArr = Array
("First" => array
("Martha" => "Text01"
,
"Lucy" => "Text02"
,
"Bob" => array
("Jhon" => array
("01", "02")
),
"Frank" => "One"
,
"Jessy" => "Two"
)
,
"Second" => array
("Mary" => array
("Jhon" => array
("03", "04")
,
"Frank" => array
("Three", "Four")
,
"Jessy" => array
("J3", "J4")
)
)
);
使用函数array_to_xml($TestArr, new SimpleXMLElement('<root/>'))
我得到一个xml,如:
<root>
<First>
<Martha>Text01</Martha>
<Lucy>Text02</Lucy>
<Bob>
<Jhon>
<_0_>01</_0_>
<_1_>02</_1_>
</Jhon>
</Bob>
<Frank>One</Frank>
<Jessy>Two</Jessy>
</First>
<Second>
<Mary>
<Jhon>
<_0_>03</_0_>
<_1_>04</_1_>
</Jhon>
<Frank>
<_0_>Three</_0_>
<_1_>Four</_1_>
</Frank>
<Jessy>
<_0_>J3</_0_>
<_1_>J4</_1_>
</Jessy>
</Mary>
</Second>
</root>
我需要的结果如下:
<root>
<First>
<Martha>Text01</Martha>
<Lucy>Text02</Lucy>
<Bob>
<Jhon>01</Jhon>
</Bob>
<Bob>
<Jhon>02</Jhon>
</Bob>
<Frank>One</Frank>
<Jessy>Two</Jessy>
</First>
<Second>
<Mary>
<Jhon>03</Jhon>
<Frank>Three</Frank>
<Jessy>J3</Jessy>
</Mary>
<Mary>
<Jhon>04</Jhon>
<Frank>Four</Frank>
<Jessy>J4</Jessy>
</Mary>
</Second>
</root>
答案 0 :(得分:3)
我已经更新了代码,试图接近你想要实现的目标。我已经考虑了如何识别数据分组的帐户,并且为此我已经添加了一个&#39; id&#39;属性以这种方式添加的每个元素。同样为了方便起见,我设置了一个最大的&#39;父元素的计数器。
第一个XPath表达式(//*[@id]/..
)获取需要处理的所有元素。然后循环计算之前计算的子元素的数量。 XPath descendant::*[@id='{$i}']
选出每组元素(因此所有元素的id =&#39; 0&#39;,然后&#39; 1&#39;等等)这是数据的自然分组。
function array_to_xml(array $arr, SimpleXMLElement $xml, string $elementName = null)
{
foreach ($arr as $k => $v) {
if (is_array($v)){
if ( preg_match('/^0|[1-9]\d*$/', implode(array_keys($v)))) {
array_to_xml($v, $xml, $k);
}
else {
array_to_xml($v, $xml->addChild($k));
}
}
else {
if ( $elementName != null ) {
$newElement = $xml->addChild($elementName, $v);
$newElement["id"] = $k;
$xml["max"] = $k;
}
else {
$xml->addChild($k, $v);
}
}
}
//return $xml;
}
$xml = new SimpleXMLElement("<root />");
array_to_xml($TestArr, $xml);
$todoList = $xml->xpath("//*[@id]/..");
foreach ( $todoList as $todo ) {
$parent = $todo->xpath("..")[0];
for ( $i = 0; $i <= $todo['max']; $i++ ) {
$content = $todo->xpath("descendant::*[@id='{$i}']");
$newName = $todo->getName();
$new = $parent->addChild($newName);
foreach ( $content as $addIn ) {
$new->addChild($addIn->getName(), (string)$addIn);
}
}
unset ( $parent->$newName[0]);
}
print $xml->asXML();
...输出
<?xml version="1.0"?>
<root>
<First>
<Martha>Text01</Martha>
<Lucy>Text02</Lucy>
<Frank>One</Frank>
<Jessy>Two</Jessy>
<Bob>
<Jhon>01</Jhon>
</Bob>
<Bob>
<Jhon>02</Jhon>
</Bob>
</First>
<Second>
<Mary>
<Jhon>03</Jhon>
<Frank>Three</Frank>
<Jessy>J3</Jessy>
</Mary>
<Mary>
<Jhon>04</Jhon>
<Frank>Four</Frank>
<Jessy>J4</Jessy>
</Mary>
</Second>
</root>
答案 1 :(得分:0)
迭代您的数组值并使用相同的键添加元素
if (is_array($v)){
foreach($v as $arr_ele){
$xml->addChild($k, $arr_ele);
}
}