2014-12-23 3 views
0

Я создаю xml-файл из массива. Я нашел ссылку How to convert array to SimpleXML и попытался создать xml с помощью ans, предоставленных пользователем Hanmant.PHP как преобразовать массив в xml

Входной массив

$data = array(
    'Pieces' => array(
    'Piece' => array(
     array(
     'PieceID' => '1', 
     'Weight' => '0.5', 
    ), 
     array(
     'PieceID' => '2', 
     'Weight' => '2.0', 
    ), 
    ), 
), 
);  

Но я получаю результат, как

<Pieces> 
    <Piece> 
    <item0> 
     <PieceID>1</PieceID> 
     <Weight>0.5</Weight> 
    </item0> 
    <item1> 
     <PieceID>2</PieceID> 
     <Weight>2.0</Weight> 
    </item1> 
    </Piece> 
</Pieces> 

Как я могу получить результат, как

<Pieces> 
    <Piece> 
    <PieceID>1</PieceID> 
    <Weight>0.5</Weight> 
    </Piece> 
    <Piece> 
    <PieceID>2</PieceID> 
    <Weight>2.0</Weight> 
    </Piece> 
</Pieces> 
+1

Вы, вероятно, следует искать другой метод, потому что комментарии к ответу вы связаны здесь, показывают, что этот метод оленья кожа работа для таких случаев, как ваш (Вложенные массивы). –

ответ

0

Читать все ответы на the link you provided, есть несколько предлагаемые там решения лучше, чем принятый ответ.

Например, один из ответа там называют этот класс: http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/

Это не только позволяет включать атрибуты, но она также позволяет генерировать XML, как вы хотите.

0

Структура массива у вас есть отличаются от того, для answer by Hanmant и поэтому вы выбрали неправильную функцию для работы ,

Однако то, что вы просите действительно требует только очень небольшой код с SimpleXMLElement, когда вы делаете это с рекурсивной функцией:

$data = array(
    'Pieces' => array(
     'Piece' => array(
      array(
       'PieceID' => '1', 
       'Weight' => '0.5', 
      ), 
      array(
       'PieceID' => '2', 
       'Weight' => '2.0', 
      ), 
     ), 
    ), 
); 

$xml = create($data); 

со следующим Defintion из создания:

function create($from, SimpleXMLelement $parent = null, $tagName = null) 
{ 
    if (!is_array($from)) { 
     if ($tagName === null) { 
      $parent[0] = (string) $from; 
     } else { 
      $parent->addChild($tagName, (string) $from); 
     } 
     return $parent; 
    } 

    foreach ($from as $key => $value) { 
     if (is_string($key)) { 
      if ($parent === null) { 
       $parent = new SimpleXMLElement("<$key/>"); 
       create($value, $parent); 
       break; 
      } 
      create($value, $parent, $key); 
     } else { 
      create($value, $parent->addChild($tagName)); 
     } 
    } 

    return $parent; 
} 

Эта функция сначала обрабатывает строковые значения для установки значений узла. Затем он пересекает массив, который имеет по крайней мере тэг для одного элемента или нескольких элементов. Если документ еще не существует, он создается, и к нему добавляются дочерние элементы (рекурсия). В противном случае добавляются только дочерние элементы (рекурсия).

Это пример кода с небольшой обработкой ошибок, поэтому будьте осторожны, следуя формату массива, который вы указали в своем вопросе.

Выход (украсили):

<?xml version="1.0"?> 
<Pieces> 
    <Piece> 
    <PieceID>1</PieceID> 
    <Weight>0.5</Weight> 
    </Piece> 
    <Piece> 
    <PieceID>2</PieceID> 
    <Weight>2.0</Weight> 
    </Piece> 
</Pieces> 
Смежные вопросы