如何使用合法的 XML 将数组转换为 SimpleXML [重复]

Posted

技术标签:

【中文标题】如何使用合法的 XML 将数组转换为 SimpleXML [重复]【英文标题】:How to convert an array to SimpleXML with legal XML [duplicate] 【发布时间】:2019-04-28 12:25:55 【问题描述】:

我想发布此步骤的答案,但它要么已关闭,要么我没有足够的分数来回答。

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>

这里有一些元素,其中messages 是一个消息数组,errors 是一个错误数组。

我对他原来的 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"));
        
    

【问题讨论】:

您链接的问题是“受保护的”,因为它已经有 41 个答案,而且 Stack Overflow 不需要包含此算法的所有可能版本。 不是重复的,功能相同,但输出与原始海报的功能不同。我试图在我的帖子中明确该功能是不同的(并且与原始功能相关),并且我包含了原始输出和修订输出的示例。 答案可能不同,但问题不一样;您作为问题提出的所有文本实际上都是您答案的一部分。如果为现有问题添加第 42 个答案足够有用,那么当您再获得 7 点声望点时,您将能够这样做,正如黄色框说明的那样(“要回答它,您必须至少获得 10 点声望在这个网站上(协会奖金不计算在内)。”)。但是,鉴于此处和其他地方的所有现有示例,请仔细考虑您希望谁阅读您的新答案。 【参考方案1】:

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

该函数为 $element 分配 $key 的值,只要它不是数字的。如果它是数字,我只是从字符串中去掉复数 's'。

此解决方案生成人们用来处理 REST api 等的 XML。从某种意义上说,它很弱,它需要在构建数组键时进行一些考虑。

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

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

【讨论】:

以上是关于如何使用合法的 XML 将数组转换为 SimpleXML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中使用 XML::Simple 将哈希转换为 XML 后内容丢失

如何使用 XSLT 将单个子 xml 元素转换为 Json 数组

将包含 POD 的包装器结构数组转换为它包含的 POD 类型数组是不是合法?

使用 Json.Net 转换为 XML 时如何序列化空数组

如何使用 PHP 将 Simple XML 解释为 HTML?

将php数组转换为xml文件