[php] 배열을 SimpleXML로 변환하는 방법

PHP에서 배열을 SimpleXML 객체로 어떻게 변환 할 수 있습니까?



답변

짧은 것 :

<?php

$test_array = array (
  'bla' => 'blub',
  'foo' => 'bar',
  'another_array' => array (
    'stack' => 'overflow',
  ),
);
$xml = new SimpleXMLElement('<root/>');
array_walk_recursive($test_array, array ($xml, 'addChild'));
print $xml->asXML();

결과

<?xml version="1.0"?>
<root>
  <blub>bla</blub>
  <bar>foo</bar>
  <overflow>stack</overflow>
</root>

키와 값이 바뀝니다 array_flip(). array_walk 전에이를 수정할 수 있습니다. array_walk_recursivePHP 5가 필요합니다. array_walk대신 사용할 수 있지만 'stack' => 'overflow'xml에 들어 가지 않습니다 .


답변

다음은 모든 깊이의 배열을 XML 문서로 변환하는 PHP 5.2 코드입니다.

Array
(
    ['total_stud']=> 500
    [0] => Array
        (
            [student] => Array
                (
                    [id] => 1
                    [name] => abc
                    [address] => Array
                        (
                            [city]=>Pune
                            [zip]=>411006
                        )                       
                )
        )
    [1] => Array
        (
            [student] => Array
                (
                    [id] => 2
                    [name] => xyz
                    [address] => Array
                        (
                            [city]=>Mumbai
                            [zip]=>400906
                        )   
                )

        )
)

생성 된 XML은 다음과 같습니다.

<?xml version="1.0"?>
<student_info>
    <total_stud>500</total_stud>
    <student>
        <id>1</id>
        <name>abc</name>
        <address>
            <city>Pune</city>
            <zip>411006</zip>
        </address>
    </student>
    <student>
        <id>1</id>
        <name>abc</name>
        <address>
            <city>Mumbai</city>
            <zip>400906</zip>
        </address>
    </student>
</student_info>

PHP 스 니펫

<?php
// function defination to convert array to xml
function array_to_xml( $data, &$xml_data ) {
    foreach( $data as $key => $value ) {
        if( is_array($value) ) {
            if( is_numeric($key) ){
                $key = 'item'.$key; //dealing with <0/>..<n/> issues
            }
            $subnode = $xml_data->addChild($key);
            array_to_xml($value, $subnode);
        } else {
            $xml_data->addChild("$key",htmlspecialchars("$value"));
        }
     }
}

// initializing or creating array
$data = array('total_stud' => 500);

// creating object of SimpleXMLElement
$xml_data = new SimpleXMLElement('<?xml version="1.0"?><data></data>');

// function call to convert array to xml
array_to_xml($data,$xml_data);

//saving generated xml file; 
$result = $xml_data->asXML('/file/path/name.xml');

?>

SimpleXMLElement::asXML이 스 니펫 에 사용 된 설명서


답변

여기에 제공된 답변은 배열을 노드가있는 XML로만 변환하므로 속성을 설정할 수 없습니다. 배열을 PHP로 변환하고 XML의 특정 노드에 대한 속성을 설정할 수있는 PHP 함수를 작성했습니다. 여기서 단점은 규칙이 거의없는 특정 방식으로 배열을 구성해야한다는 것입니다 (속성을 사용하려는 경우에만)

다음 예제에서는 XML에서도 속성을 설정할 수 있습니다.

소스는 https://github.com/digitickets/lalit/blob/master/src/Array2XML.php 에서 찾을 수 있습니다.

<?php    
$books = array(
    '@attributes' => array(
        'type' => 'fiction'
    ),
    'book' => array(
        array(
            '@attributes' => array(
                'author' => 'George Orwell'
            ),
            'title' => '1984'
        ),
        array(
            '@attributes' => array(
                'author' => 'Isaac Asimov'
            ),
            'title' => 'Foundation',
            'price' => '$15.61'
        ),
        array(
            '@attributes' => array(
                'author' => 'Robert A Heinlein'
            ),
            'title' => 'Stranger in a Strange Land',
            'price' => array(
                '@attributes' => array(
                    'discount' => '10%'
                ),
                '@value' => '$18.00'
            )
        )
    )
);
/* creates 
<books type="fiction">
  <book author="George Orwell">
    <title>1984</title>
  </book>
  <book author="Isaac Asimov">
    <title>Foundation</title>
    <price>$15.61</price>
  </book>
  <book author="Robert A Heinlein">
    <title>Stranger in a Strange Land</title>
    <price discount="10%">$18.00</price>
  </book>
</books>
*/
?>


답변

너무 많은 코드를 사용하는 모든 답변을 찾았습니다. 쉬운 방법은 다음과 같습니다.

function to_xml(SimpleXMLElement $object, array $data)
{   
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            $new_object = $object->addChild($key);
            to_xml($new_object, $value);
        } else {
            // if the key is an integer, it needs text with it to actually work.
            if ($key == (int) $key) {
                $key = "key_$key";
            }

            $object->addChild($key, $value);
        }   
    }   
}   

그런 다음 재귀를 사용하는 함수로 배열을 보내는 것이 간단하므로 다차원 배열을 처리합니다.

$xml = new SimpleXMLElement('<rootTag/>');
to_xml($xml, $my_array);

이제 $ xml에는 배열을 기반으로 작성한 정확한 XML 객체가 포함되어 있습니다.

print $xml->asXML();


답변

<? php
array_to_xml 함수 (배열 $ arr, SimpleXMLElement $ xml)
{
    foreach ($ arr as $ k => $ v) {
        is_array ($ v)
            ? array_to_xml ($ v, $ xml-> addChild ($ k))
            : $ xml-> addChild ($ k, $ v);
    }
    $ xml 반환;
}

$ test_array = 배열 ​​(
    'bla'=> 'blub',
    'foo'=> 'bar',
    'another_array'=> 배열 (
        'stack'=> '오버플로',
    ),
);

echo array_to_xml ($ test_array, 새로운 SimpleXMLElement ( '<root />'))-> asXML ();


답변

PHP 5.4에서

function array2xml($data, $root = null){
    $xml = new SimpleXMLElement($root ? '<' . $root . '/>' : '<root/>');
    array_walk_recursive($data, function($value, $key)use($xml){
        $xml->addChild($key, $value);
    });
    return $xml->asXML();
}


답변

또 다른 개선 사항 :

/**
* Converts an array to XML
*
* @param array $array
* @param SimpleXMLElement $xml
* @param string $child_name
*
* @return SimpleXMLElement $xml
*/
public function arrayToXML($array, SimpleXMLElement $xml, $child_name)
{
    foreach ($array as $k => $v) {
        if(is_array($v)) {
            (is_int($k)) ? $this->arrayToXML($v, $xml->addChild($child_name), $v) : $this->arrayToXML($v, $xml->addChild(strtolower($k)), $child_name);
        } else {
            (is_int($k)) ? $xml->addChild($child_name, $v) : $xml->addChild(strtolower($k), $v);
        }
    }

    return $xml->asXML();
}

용법:

$this->arrayToXML($array, new SimpleXMLElement('<root/>'), 'child_name_to_replace_numeric_integers');