如何使用合法XML将数组转换为SimpleXML

时间:2018-11-26 20:05:06

标签: php arrays xml simplexml

我想发布有关此问题的答案,但要么没有答案,要么我没有足够的分数来回答。

How to convert array to SimpleXML

我喜欢@Hanmant使用他编写的array_to_xml函数的答案。这几乎是我需要的答案。我不喜欢它如何创建编号为“ item0”的子元素:

例如:

这是我的示例数组:

$array = array();
$array["exampleOrderId"] = 1097374;
$array["timeStamp"] = date("Y-m-d", time());
$array["messages"][] = "Order Received";
$array["messages"][] = "Order Submitted For Processsing";
$array["events"][] = "Top Level Event";
$array["events"][] = "Moving order to processing queue";
$array["errors"][] = "Order item is not in stock";

初始输出:

<?xml version="1.0" encoding="UTF-8"?>
<orderResponse>
   <exampleOrderId>1097374</exampleOrderId>
   <timeStamp>2018-11-26</timeStamp>
   <messages>
      <item0>Order Received</item0>
      <item1>Order Submitted For Processsing</item1>
   </messages>
   <events>
      <item0>Top Level Event</item0>
      <message>
         <item0>Moving order to processing queue</item0>
         <error>
            <item0>Order item is not in stock</item0>
         </error>
      </message>
   </events>
</orderResponse>

这里有一些元素,其中message是消息数组,而error是错误数组。

我对其原始的array_to_xml函数进行了很小的更改,因此它产生了一个子元素,它是其父元素的单数形式:

<?xml version="1.0" encoding="UTF-8"?>
<orderResponse>
   <exampleOrderId>1097374</exampleOrderId>
   <timeStamp>2018-11-26</timeStamp>
   <messages>
      <message>Order Received</message>
      <message>Order Submitted For Processsing</message>
   </messages>
   <events>
      <event>Top Level Event</event>
      <event>Moving order to processing queue</event>
   </events>
   <errors>
      <error>Order item is not in stock</error>
   </errors>
</orderResponse>

这是修改后的功能:

function array_to_xml( $data, &$xml_data, $element = "") {
    foreach( $data as $key => $value ) {
        if(! is_numeric($key) ){
            $element = $key;
        } else {
            $element = rtrim($element,'s');
        }

        if( is_array($value) ) {
            $subnode = $xml_data->addChild($element);
            array_to_xml($value, $subnode, $element);
        } else {
            $xml_data->addChild("$element",htmlspecialchars("$value"));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我在这里所做的只是向函数$ element添加一个可选参数。 我在addChild方法中使用了$ element而不是$ key。

该函数为$ element分配$ key的值,只要它不是数字即可。如果它是数字,则只需从字符串中去除复数“ s”。

此解决方案产生了人们在REST api等中使用的XML。从某种意义上说,它是弱的,它在构造数组键时需要考虑一些因素。

它像原始作者一样递归地工作。

正如我所提到的,我发布的内容并不多,也不知道如何很好地使用该网站。如果我引用了原始函数的错误作者,我很乐意解决这个问题。