2013-04-18 57 views
3

我正在研究一个XML库,它可以从数组/ jsons创建/解析xml。 我设法用xml_parser(和google help:p)编写解析器,导致SimpleXML对我所做的不够好。将具有属性的php数组转换为XML

我已经成功地创建一个数组,看起来就像这样:

Array 
(
[flow] => Array 
    (
     [math] => Array 
      (
       [apply] => Array 
        (
         [lt] => Array 
          (
          ) 

         [apply] => Array 
          (
           [divide] => Array 
            (
            ) 

           [apply] => Array 
            (
             [minus] => Array 
              (
              ) 
            ) 
          ) 

         [otherStuff] => 0 
        ) 

      ) 

     [true] => Array 
      (


      ) 

     [true_attr] => Array 
      (
       [xsi:type] => SomeStuff 
       [id] => 2 
      ) 

    ) 

[flow_attr] => Array 
    (
     [id] => 0 
     [xmlns:xsi] => http://www.w3.org/2001/XMLSchema-instance 
    ) 
) 

正如你所看到的,它应该是这个样子(不是最好的例子:P):

<flow id="0"> 
<math> 
<lalaa/> 
    <appyl> 
</apply> 
    </math> 
</flow> 

请注意,空阵列应以/>结尾,例如,等等

正如您所看到的,我将节点自己分隔为包含节点attrs的node_attr。像flow_attr,true_attr。

任何人都有一个想法如何将此数组转换回xml? 我只是迷路了,不知道该怎么办。

感谢您的帮助!

+1

这个类对于这种类型的东西非常有用:http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/ –

回答

3
function recurse2xml ($array, &$string = "") { 
    foreach ($array as $key => $subArray) { 
     if (substr($key, -5) == "_attr") 
      continue; 
     $attrs = ""; 
     if (isset($array["$key_attr"])) 
      foreach ($array["$key_attr"] as $attr => $value) 
       $attrs .= " $attr='".str_replace($value, "'", "\\'")."'"; 
     if (empty($subArray)) { 
      $string .= "<$key$attrs />" 
     } else { 
      $string .= "<$key$attrs>"; 
      if (is_scalar($subArray)) 
       $string .= $subArray; 
      else 
       recurse2xml($subArray, $string); 
      $string .= "</$key>"; 
     } 
    } 
    return $string; 
} 

这个函数调用recurse2xml($array);扩展了您的阵列树转换成XML树(字符串形式)。

+0

感谢您的答案!它没有奏效,但我会尝试分叉它并继续前进。 –

+0

@MichaelArenzon它输出我期望的东西......但是你期待什么? – bwoebi

+0

这里有一些语法错误,它不支持当有一个值,如在这里:[otherStuff] => 0所以我得到像这样的:<0> 和attrs不显示从一些奇怪的原因:S 但是谢谢 –

1

尝试Array2XML,为我工作障碍。包括CDATA部件,等等

+1

试着把这种东西放在注释。 –

+0

对不起,相当新的Stackoverflow ... – pmayer

0
function recursiveArrayToXml($array, &$return=""){ 
    foreach ($array as $key => $subarray){ 
     if(empty($key)) {continue;} 
     $key = preg_replace('/[^\da-z]/i', '', $key); 
     if(preg_match('/[0-9]/i',$key[0])){ 
      $key = 'x'.$key; 
     } 
     $return .= "<".$key.">"; 
     if(!is_array($subarray)){ 
      $return .= htmlentities($subarray); 
     }else{ 
      recursiveArrayToXml($subarray, $return); 
     } 
     $return .= "</".$key.">\n"; 
    } 
    return $return; 
} 

该函数将类似于在元素名称和元素值中发布的上述修复问题。 由recursiveArrayToXml($ myArray)调用;