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 に答える