0

我有这个数组($data):

Array (
    [status_code] => X
    [key_1] => 12345
    [key_2] => 67890
    [short_message] => test
    [long_message] => test_long_message
)

但我正在努力将其转换为 XML 元素。

这是我的代码:

$xml = new SimpleXMLElement('<root/>');
array_walk_recursive($data, array ($xml, 'addChild'));
print $xml->asXML();

这是我想要的结果:

<root>
    <status_code>X</status_code>
    <key_1>12345</key_1>
    <key_2>67890</key_2>
    <short_message>test</short_message>
    <long_message>test_long_message</long_message>
</root>

相反,我得到:

<X>1234567890testtest_message_long

有人可以指出我做错了什么吗?

谢谢,

彼得

4

2 回答 2

1

SimpleXMLElement.addChild()按顺序获取其参数$elementName, $elementValue

array_walk_recursive()按顺序传递元素$value, $key(在您的示例中为$elementValue, $elementName)。

这应该有效:

$data = array(
    'status_code' => 'X',
    'key_1' => 12345
);
$xml = new SimpleXMLElement('<root/>');
array_walk_recursive(
    $data,
    function ($value, $key) use ($xml) {
        $xml->addChild($key, $value);
    }
);
echo $xml->asXML();
于 2013-10-28T23:25:59.530 回答
0

把它写出来,它更容易阅读和改变:

foreach ($data as $name => $value) {
    $xml->$name = $value;
}

当一个简单的 foreach 可以做到时,并不总是需要一个回调。然而,创建一个实用函数也不是那么糟糕:

function simplexml_add_array(SimpleXMLElement $xml, array $data) {
    foreach ($data as $name => $value) {
        $xml[$name] = $value;
    }
}

最后通过继承(Demo):

class SimplerXMLElement extends SimpleXMLElement
{
    public function addArray(array $data) {
        foreach ($data as $name => $value) {
            $this->$name = $value;
        }
    }
}


$xml = new SimplerXMLElement ('<root/>');
$xml->addArray($data);
print $xml->asXML();

程序输出(美化):

<?xml version="1.0"?>
<root>
  <status_code>X</status_code>
  <key_1>12345</key_1>
  <key_2>67890</key_2>
  <short_message>test</short_message>
  <long_message>test_long_message</long_message>
</root>
于 2013-10-29T16:58:06.690 回答