多维数组到多维 SimpleXMLElement(XML 对象)[重复]
Posted
技术标签:
【中文标题】多维数组到多维 SimpleXMLElement(XML 对象)[重复]【英文标题】:Multidimensional Array to Multidimensional SimpleXMLElement (XML Object) [duplicate] 【发布时间】:2019-02-27 22:29:08 【问题描述】:我在创建多维 SimpleXMLElement 时遇到了一些问题,它适用于简单数组,但是当存在多维数组时,SimpleXMLElement 不会写入多维 SimpleXMLEelement。像这样:
createXML 函数:
public function createXML($data, $root = null)
$xml = new \SimpleXMLElement($root ? '<' . $root . '/>' : '<marathon/>');
array_walk_recursive($data, function($value, $key)use($xml)
$xml->addChild($key, $value);
);
$dom = dom_import_simplexml($xml)->ownerDocument;
$dom->encoding = "UTF-8";
$dom->formatOutput = true;
print $dom->saveXML();
打印如下:
<marathon>
<media_id>FACE</media_id>
<agreement_id>****</agreement_id>
<client_reference>123456</client_reference>
<client_contact>Asim</client_contact>
<plan_number>407</plan_number>
<plan_name>TEST</plan_name>
<cuid>123456</cuid>
<status>P</status>
<colour>0</colour>
<insertion_date>2018-09-19</insertion_date>
<end_date>2018-09-20</end_date>
<client_reference>1234</client_reference>
<price_code>0</price_code>
<number_of_units>250000</number_of_units>
<gross>1000</gross>
<comment>THIS IS A TEST DO NOT FAKTURER</comment>
</marathon>
当我想要的是:
<marathon>
<media_id>FACE</media_id>
<agreement_id>REDP</agreement_id>
<client_reference>123456</client_reference>
<client_contact>Asim Tariq</client_contact>
<plan_number>407</plan_number>
<plan_name>TEST</plan_name>
<cuid>123456</cuid>
<status>P</status>
<colour>0</colour>
<insertion>
<insertion_date>2018-09-19</insertion_date>
<end_date>2018-09-20</end_date>
<client_reference>1234</client_reference>
<price_row>
<price_code>0</price_code>
<number_of_units>250000</number_of_units>
<gross>1000</gross>
<comment>THIS IS A TEST DO NOT FAKTURER</comment>
</price_row>
</insertion>
</marathon>
如何使用createXML
中的代码管理此问题? XML 不是多维的?
这是我发送的数组 $data:
[
"media_id" => 'FACE',
"agreement_id" => 'REDP',
"client_reference" => 123456,
"client_contact" => "Asim Tariq",
"plan_number" => 407,
"plan_name" => "TEST",
"cuid" => 123456,
"status" => 'P',
"colour" => 0,
"insertion" => [
"insertion_date" => '2018-09-19',
"end_date" => '2018-09-20',
"client_reference" => 1234,
"price_row" => [
"price_code" => 000,
"number_of_units" => 250000,
"gross" => 1000,
"discount" => [
],
"comment" => "THIS IS A TEST DO NOT FAKTURER",
],
],
]
【问题讨论】:
好吧,现在您只是将元素附加到根元素$xml->addChild()
- 因此必须相应地更改该部分,以某种方式将正确的当前父元素传递给一起工作。
@PhilippMaurer 它不是重复的。我不仅无法将元素添加到根目录。您提供的链接未提供此详细信息。
是的@misorude 看起来甚至缺少“插入”键,并且该数组中的键/值放在根元素上。我怎样才能使它成为一个键并在 XML 中添加元素?
你试过this回答吗?
“看起来连“插入”键都丢失了” - 可能是因为在这种情况下您也尝试执行 addChild($key, $value)
,甚至尽管这种情况下的值本身就是一个数组。您需要区分这两种情况。不确定array_walk_recursive
是否是解决此问题的最佳方式;递归调用自身的自写函数可能是更好的选择。
【参考方案1】:
根据the documentation for array_walk_recursive
,“任何包含数组的键都不会传递给函数”。
编写一个递归函数,如果它是一个数组,则将值添加到子元素中。例如:
private function addXMLData(\SimpleXMLElement $xml, array $data)
array_walk($data, function($value, $key) use($xml)
if (is_array($value))
$child = $xml->addChild($key);
self::addXMLData($child, $value);
else
$xml->addChild($key, $value);
);
public function createXML($data, $root = null)
$xml = new \SimpleXMLElement($root ? '<' . $root . '/>' : '<marathon/>');
self::addXMLData($xml, $data);
$dom = dom_import_simplexml($xml)->ownerDocument;
$dom->encoding = "UTF-8";
$dom->formatOutput = true;
print $dom->saveXML();
【讨论】:
是的,因此无法使用 array_walk_recursive。我尝试快速复制/粘贴您的代码以检查它是否可以开箱即用,但我收到此错误:不在对象上下文中使用 $this。这与私有/公共功能有很好的关系吗?我用来调用函数createXML的方法:$request_xml = self::createXML($request); 我已经相应地编辑了答案。我没有意识到您正在静态调用该函数。 那是我的错对不起@Matt。您的解决方案现在完美运行!!非常感谢:)以上是关于多维数组到多维 SimpleXMLElement(XML 对象)[重复]的主要内容,如果未能解决你的问题,请参考以下文章