【问题标题】:Convert PHP nested array to XML tree structure将 PHP 嵌套数组转换为 XML 树结构
【发布时间】:2014-10-13 08:53:59
【问题描述】:

我在 PHP 中有以下数组,我想将其转换为等效的 XML。

$data = array("VitalParameters"=>array(
                    "Details"=>array(
                        "PID"=>1234,
                        "OPID"=>1345
                    ),
                    "Parameters"=>array(
                        "HR"=>112,
                        "SPO2"=>0
                )));

遵循我所期望的 XML 树结构

<VitalParameters>
    <Details>
      <PID>1234</PID>
      <OPID>1345</OPID>
    </Details>
    <Parameters>
      <HR>112</HR>
      <SPO2>0</SPO2>
    </Parameters>
</VitalParameters>

我尝试了很多东西,但没有运气。如果需要更多信息,请发表评论,我会提供更多信息。

【问题讨论】:

  • 投了反对票,请评论你想要什么或给反对票的建议

标签: php xml


【解决方案1】:

我认为 - 这一定更简单:

function arrayToXML($arr){

  $s = "";

  foreach($arr as $k => $v){
    if(is_array($v)){$v = arrayToXML($v);}
    $s .= "<{$k}>{$v}</{$k}>";
  }

  return $s;}

【讨论】:

    【解决方案2】:

    我得到了类似以下代码的解决方案

    <?php
    header("Content-type: text/xml; charset=utf-8");
    $data = array(
        "Details" => array(
            "PID" => "1234","OPID" => "1345"
        ),"Parameters" => array(
            "HR" => "112","SPO2" => "0"
        )
    );
    
    $domtree = new DOMDocument('1.0', 'UTF-8');
    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("VitalParameters");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);
    
    foreach ($data as $key=>$value)
    {
        $currentElement= $domtree->createElement($key);
        $currentElement= $xmlRoot->appendChild($currentElement);
        if(is_array($value))
        {
            foreach ($value as $k=>$v)
            {
                $currentElement->appendChild($domtree->createElement($k,$v));
            }
        }
    }
    
    /* get the xml printed */
    echo $domtree->saveXML();
    

    输出

    <VitalParameters>
      <Details>
        <PID>1234</PID>
        <OPID>1345</OPID>
      </Details>
      <Parameters>
        <HR>112</HR>
        <SPO2>0</SPO2>
      </Parameters>
    </VitalParameters>
    

    【讨论】:

      【解决方案3】:

      试试 Array2XML (http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes) 这对我有用。

      $data = array(
        "Details" => array(
          "PID" => 1234,
          "OPID" => 1345
        ),
        "Parameters" => array(
          "HR" => 112,
          "SPO2" => 0
      ));
      
      
      $xml = Array2XML::createXML('VitalParameters', $data)->saveXML();
      
      echo $xml;
      

      输出

      <?xml version="1.0" encoding="UTF-8"?>
      <VitalParameters>
        <Details>
          <PID>1234</PID>
          <OPID>1345</OPID>
        </Details>
        <Parameters>
          <HR>112</HR>
          <SPO2>0</SPO2>
        </Parameters>
      </VitalParameters>
      

      【讨论】:

      • 我试过了,但给了我像XML Parsing Error: no element found这样的错误
      • 你在用火狐吗?看看stackoverflow.com/questions/975929/…
      • 在谷歌浏览器中也无法正常工作,我收到了This XML file does not appear to have any style information associated with it. The document tree is shown below.
      【解决方案4】:

      这应该让你走上正确的轨道,但可能需要一些调整(尤其是关于键以及首先检查 $arr 是否是一个数组/对象......这只是为了向你展示如何递归迭代它们并打印数据)。

      另外,这个 sn-p 不以任何方式支持 XML 属性。

      <?php
      $data = array("VitalParameters"=>array(
                          "Details"=>array(
                              "PID"=>1234,
                              "OPID"=>1345
                          ),
                          "Parameters"=>array(
                              "HR"=>112,
                              "SPO2"=>0
                      )));
      
      function ArrayToXML($arr, $depth = 0, $maxDepth = 2)
      {
          $retVal = "";
          foreach($arr as $key => $value)
          {
              $retVal .= "<" . $key . ">";
      
              $type = gettype($value);
              switch($type)
              {
                  case "array":
                  case "object":
                      if ($depth < $maxDepth)
                          $retVal .= ArrayToXml($value, $depth+1, $maxDepth);
                      else
                          $retVal .= $type; // Depth >= MaxDepth, not iterating here
                      break;
                  case "boolean":
                      $retVal .= $value ? "true" : "false";
                      break;
                  case "resource":
                      $retVal .= "Resource";
                  case "NULL":
                      $retVal .= "NULL";
                  default:
                      $retVal .= $value;
              }
              $retVal .= "</" . $key . ">\n";
          }
          return $retVal;
      }
      
      echo ArrayToXML($data);
      ?>
      

      输出:

      <VitalParameters><Details><PID>1234</PID>
      <OPID>1345</OPID>
      </Details>
      <Parameters><HR>112</HR>
      <SPO2>0</SPO2>
      </Parameters>
      </VitalParameters>
      

      【讨论】:

      • 我可以设置像&lt;?xml version="1.0" encoding="utf-8"?&gt;这样的标题吗,因为我想将文件保存为XML
      • 您的代码给出了正确的输出,但不显示我上面提到的标题,所以我如何设置标题?
      • 您应该能够使用 PHP 的 header() 函数发送 Content-Type。正如我所提到的:这不是一个完整的 XML 实现。属性不起作用,键缺少完整性检查,而且可能还有很多。
      猜你喜欢
      • 2014-07-09
      • 2021-02-09
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多