2013-04-18 88 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)調用;