将PHP嵌套数组转换为XML树结构

将PHP嵌套数组转换为XML树结构,php,xml,Php,Xml,我在PHP中有以下数组,我想将其转换为等价的XML $data = array("VitalParameters"=>array( "Details"=>array( "PID"=>1234, "OPID"=>1345 ), "Parameters"=>

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

1234
1345

112 0
我尝试了很多事情,但没有成功。如果需要更多信息,请发表评论,我将提供更多信息。

试试Array2XML(),这对我很有用

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

1234
1345

112 0
这应该会让您走上正确的轨道,但可能需要一些调整(特别是在关键点方面,以及首先检查$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);
?>
$value)
{
$retVal.=“”;
$type=gettype($value);
交换机($类型)
{
案例“数组”:
案例“对象”:
如果($depth<$maxDepth)
$retVal.=ArrayToXml($value、$depth+1、$maxDepth);
其他的
$retVal.=$type;//Depth>=MaxDepth,此处不迭代
打破
案例“布尔”:
$retVal.=$value?“真”:“假”;
打破
案例“资源”:
$retVal.=“资源”;
“空”情况:
$retVal.=“空”;
违约:
$retVal.=$value;
}
$retVal.=“\n”;
}
返回$retVal;
}
echo ArrayToXML($data);
?>
输出:

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

112 0
我得到了如下代码所示的解决方案

<?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();
数组(
“PID”=>“1234”、“OPID”=>“1345”
),“参数”=>数组(
“心率”=>“112”,“血氧饱和度”=>“0”
)
);
$domtree=新的DOMDocument('1.0','UTF-8');
/*创建xml树的根元素*/
$xmlRoot=$domtree->createElement(“VitalParameters”);
/*将其附加到创建的文档中*/
$xmlRoot=$domtree->appendChild($xmlRoot);
foreach($key=>$value形式的数据)
{
$currentElement=$domtree->createElement($key);
$currentElement=$xmlRoot->appendChild($currentElement);
if(是_数组($value))
{
foreach($k=>v的值)
{
$currentElement->appendChild($domtree->createElement($k,$v));
}
}
}
/*打印xml*/
echo$domtree->saveXML();
输出

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

1234
1345

112 0
我认为-这必须更简单:

function arrayToXML($arr){

  $s = "";

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

  return $s;}
函数arrayToXML($arr){
$s=“”;
foreach($arr为$k=>$v){
if(is_数组($v)){$v=arrayToXML($v);}
$s.=“{$v}”;
}
返回$s;}

Down-voted请评论您想要的内容或给downvoteI提供建议我尝试过但给我错误,如
XML解析错误:找不到元素
您在使用firefox吗?看看。在谷歌浏览器中,chrome也不起作用,我得到的
这个XML文件似乎没有任何与之相关的样式信息。文档树如下图所示。
我可以像
那样设置标题吗?因为我想将文件另存为XML。您的代码提供了正确的输出,但没有像我上面提到的那样显示标题,因此如何设置标题?您应该能够使用PHPs
header()
函数发送
内容类型。正如我所提到的:这不是一个完全充实的XML实现。属性不起作用,键缺少健全性检查,可能还有更多。