多维数组到多维 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-&gt;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 对象)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

多维数组到多维对象

在循环内将数组添加到多维数组

将多维数组保存到存储

多维数组索引 C++ 中的多维数组

如何理解JS多维数组

将值附加到多维数组 PHP