2013-04-18 2 views
3

Я работаю над библиотекой XML, которая может создавать/анализировать xml из массивов/jsons. Мне удалось написать парсер с помощью 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 
    ) 
) 

Как вы можете видеть, это должно выглядеть примерно так (не лучший пример: р):

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

Обратите внимание, что пустые массивы должны заканчиваться на /> например, и так далее.

Как вы можете видеть, я разделил узел на себя на node_attr, содержащий attrs узлов. Как 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);

Смежные вопросы