簡體   English   中英

將PHP嵌套數組轉換為XML樹結構

[英]Convert PHP nested array to XML tree structure

我在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>

我嘗試了很多事情,但是沒有運氣。 如果需要更多信息,請發表評論。

嘗試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>

這應該使您走上正確的軌道,盡管可能需要進行一些調整(尤其是在鍵方面以及首先檢查$ arr是否是數組/對象……這只是向您展示如何遞歸地迭代它們,以及打印數據)。

另外,此代碼段不以任何方式支持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>

我得到了如下代碼的解決方案

<?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>

我認為-這必須更簡單:

function arrayToXML($arr){

  $s = "";

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

  return $s;}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM