복붙노트

배열을 SimpleXML로 변환하는 방법

PHP

배열을 SimpleXML로 변환하는 방법

PHP에서 배열을 SimpleXML 객체로 변환하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.

    짧은 것 :

    <?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_walk 앞에 array_flip ()으로 수정할 수 있습니다. array_walk_recursive는 PHP 5가 필요합니다. 대신에 array_walk를 사용할 수는 있지만, xml에 'stack'=> 'overflow'를 얻을 수는 없습니다.

  2. ==============================

    2.

    다음은 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_numeric($key) ){
                $key = 'item'.$key; //dealing with <0/>..<n/> issues
            }
            if( is_array($value) ) {
                $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 문서

  3. ==============================

    3.

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

    다음 예는 XML로 속성을 설정하는 것을 허용합니다.

    자세한 예제 및 사용법은 다음에서 찾을 수 있습니다. http://www.lalit.org/lab/convert-php-array-to-xml-with-attributes/

    <?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>
    */
    ?>
    
  4. ==============================

    4.

    너무 많은 코드를 사용하는 모든 답변을 찾았습니다. 다음과 같이 쉽게 할 수 있습니다.

    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();
    
  5. ==============================

    5.

    <?php
    function array_to_xml(array $arr, SimpleXMLElement $xml)
    {
        foreach ($arr as $k => $v) {
            is_array($v)
                ? array_to_xml($v, $xml->addChild($k))
                : $xml->addChild($k, $v);
        }
        return $xml;
    }
    
    $test_array = array (
        'bla' => 'blub',
        'foo' => 'bar',
        'another_array' => array (
            'stack' => 'overflow',
        ),
    );
    
    echo array_to_xml($test_array, new SimpleXMLElement('<root/>'))->asXML();
    
  6. ==============================

    6.

    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();
    }
    
  7. ==============================

    7.

    또 다른 개선점 :

    /**
    * 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');
    
  8. ==============================

    8.

    여기 내 입장, 간단하고 깨끗한 ..

    function array2xml($array, $xml = false){
        if($xml === false){
            $xml = new SimpleXMLElement('<root/>');
        }
        foreach($array as $key => $value){
            if(is_array($value)){
                array2xml($value, $xml->addChild($key));
            }else{
                $xml->addChild($key, $value);
            }
        }
        return $xml->asXML();
    }
    
    
    header('Content-type: text/xml');
    print array2xml($array);
    
  9. ==============================

    9.

    그래서 어쨌든 ... 나는 onokazu 코드 (감사합니다!)를 취하여 XML로 반복 된 태그를 가질 수있는 기능을 추가했습니다. 또한 속성을 지원하므로 누군가가 유용하다고 생각하길 바랍니다!

     <?php
    
    function array_to_xml(array $arr, SimpleXMLElement $xml) {
            foreach ($arr as $k => $v) {
    
                $attrArr = array();
                $kArray = explode(' ',$k);
                $tag = array_shift($kArray);
    
                if (count($kArray) > 0) {
                    foreach($kArray as $attrValue) {
                        $attrArr[] = explode('=',$attrValue);                   
                    }
                }
    
                if (is_array($v)) {
                    if (is_numeric($k)) {
                        array_to_xml($v, $xml);
                    } else {
                        $child = $xml->addChild($tag);
                        if (isset($attrArr)) {
                            foreach($attrArr as $attrArrV) {
                                $child->addAttribute($attrArrV[0],$attrArrV[1]);
                            }
                        }                   
                        array_to_xml($v, $child);
                    }
                } else {
                    $child = $xml->addChild($tag, $v);
                    if (isset($attrArr)) {
                        foreach($attrArr as $attrArrV) {
                            $child->addAttribute($attrArrV[0],$attrArrV[1]);
                        }
                    }
                }               
            }
    
            return $xml;
        }
    
            $test_array = array (
              'bla' => 'blub',
              'foo' => 'bar',
              'another_array' => array (
                array('stack' => 'overflow'),
                array('stack' => 'overflow'),
                array('stack' => 'overflow'),
              ),
              'foo attribute1=value1 attribute2=value2' => 'bar',
            );  
    
            $xml = array_to_xml($test_array, new SimpleXMLElement('<root/>'))->asXML();
    
            echo "$xml\n";
            $dom = new DOMDocument;
            $dom->preserveWhiteSpace = FALSE;
            $dom->loadXML($xml);
            $dom->formatOutput = TRUE;
            echo $dom->saveXml();
        ?>
    
  10. ==============================

    10.

    PHP와 jQuery 등에서 앞뒤로 전달할 XML을 생성하기 위해 잠시 쓴 함수 몇 개를 사용합니다. SimpleXML (또는 다른 프레임 워크)과 함께 사용할 수있는 문자열을 순전히 생성하는 추가 프레임 워크를 사용하지 마십시오.

    누구에게나 유용하다면 사용하십시오 :)

    function generateXML($tag_in,$value_in="",$attribute_in=""){
        $return = "";
        $attributes_out = "";
        if (is_array($attribute_in)){
            if (count($attribute_in) != 0){
                foreach($attribute_in as $k=>$v):
                    $attributes_out .= " ".$k."=\"".$v."\"";
                endforeach;
            }
        }
        return "<".$tag_in."".$attributes_out.((trim($value_in) == "") ? "/>" : ">".$value_in."</".$tag_in.">" );
    }
    
    function arrayToXML($array_in){
        $return = "";
        $attributes = array();
        foreach($array_in as $k=>$v):
            if ($k[0] == "@"){
                // attribute...
                $attributes[str_replace("@","",$k)] = $v;
            } else {
                if (is_array($v)){
                    $return .= generateXML($k,arrayToXML($v),$attributes);
                    $attributes = array();
                } else if (is_bool($v)) {
                    $return .= generateXML($k,(($v==true)? "true" : "false"),$attributes);
                    $attributes = array();
                } else {
                    $return .= generateXML($k,$v,$attributes);
                    $attributes = array();
                }
            }
        endforeach;
        return $return;
    }   
    

    모두에게 사랑 :)

  11. ==============================

    11.

    배열 안의 모든 요소를 ​​취하여 속성으로 처리하고 모든 배열을 하위 요소로 처리하는 코드가 필요했습니다.

    그래서

    array (
    'row1' => array ('head_element' =>array("prop1"=>"some value","prop2"=>array("empty"))),
    "row2"=> array ("stack"=>"overflow","overflow"=>"overflow")
    );
    

    나는 이런 것을 얻을 것이다.

    <?xml version="1.0" encoding="utf-8"?>
    <someRoot>
      <row1>
        <head_element prop1="some value">
          <prop2 0="empty"/>
        </head_element>
      </row1>
      <row2 stack="overflow" overflow="stack"/>
     </someRoot>
    

    이를 달성하기 위해 코드는 아래에 있지만 매우 조심해야하며 재귀 적이며 실제로 스택 오버플로가 발생할 수 있습니다.

    function addElements(&$xml,$array)
    {
    $params=array();
    foreach($array as $k=>$v)
    {
        if(is_array($v))
            addElements($xml->addChild($k), $v);
        else $xml->addAttribute($k,$v);
    }
    
    }
    function xml_encode($array)
    {
    if(!is_array($array))
        trigger_error("Type missmatch xml_encode",E_USER_ERROR);
    $xml=new SimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><'.key($array).'/>');
    addElements($xml,$array[key($array)]);
    return $xml->asXML();
    } 
    

    일부 요소가 데이터 부분 안에 설정되고 속성으로 설정되지 않도록 배열의 길이에 대한 검사를 추가 할 수 있습니다.

  12. ==============================

    12.

    여기에있는 모든 것을 기반으로 @ 접두어로 숫자 인덱스 + 속성을 처리하고 기존 노드에 XML을 삽입 할 수 있습니다.

    function simple_xmlify($arr, SimpleXMLElement $root = null, $el = 'x') {
        // based on, among others http://stackoverflow.com/a/1397164/1037948
    
        if(!isset($root) || null == $root) $root = new SimpleXMLElement('<' . $el . '/>');
    
        if(is_array($arr)) {
            foreach($arr as $k => $v) {
                // special: attributes
                if(is_string($k) && $k[0] == '@') $root->addAttribute(substr($k, 1),$v);
                // normal: append
                else simple_xmlify($v, $root->addChild(
                        // fix 'invalid xml name' by prefixing numeric keys
                        is_numeric($k) ? 'n' . $k : $k)
                    );
            }
        } else {
            $root[0] = $arr;
        }
    
        return $root;
    }//--   fn  simple_xmlify
    
    // lazy declaration via "queryparam"
    $args = 'hello=4&var[]=first&var[]=second&foo=1234&var[5]=fifth&var[sub][]=sub1&var[sub][]=sub2&var[sub][]=sub3&var[@name]=the-name&var[@attr2]=something-else&var[sub][@x]=4.356&var[sub][@y]=-9.2252';
    $q = array();
    parse_str($val, $q);
    
    $xml = simple_xmlify($q); // dump $xml, or...
    $result = get_formatted_xml($xml); // see below
    
    <?xml version="1.0"?>
    <x>
      <hello>4</hello>
      <var name="the-name" attr2="something-else">
        <n0>first</n0>
        <n1>second</n1>
        <n5>fifth</n5>
        <sub x="4.356" y="-9.2252">
          <n0>sub1</n0>
          <n1>sub2</n1>
          <n2>sub3</n2>
        </sub>
      </var>
      <foo>1234</foo>
    </x>
    
    function get_formatted_xml(SimpleXMLElement $xml, $domver = null, $preserveWhitespace = true, $formatOutput = true) {
        // http://stackoverflow.com/questions/1191167/format-output-of-simplexml-asxml
    
        // create new wrapper, so we can get formatting options
        $dom = new DOMDocument($domver);
        $dom->preserveWhiteSpace = $preserveWhitespace;
        $dom->formatOutput = $formatOutput;
        // now import the xml (converted to dom format)
        /*
        $ix = dom_import_simplexml($xml);
        $ix = $dom->importNode($ix, true);
        $dom->appendChild($ix);
        */
        $dom->loadXML($xml->asXML());
    
        // print
        return $dom->saveXML();
    }//--   fn  get_formatted_xml
    
  13. ==============================

    13.

    나를 위해 트릭을 한 기능은 다음과 같습니다.

    그냥 전화 해.

    echo arrayToXml("response",$arrayIWantToConvert);
    function arrayToXml($thisNodeName,$input){
            if(is_numeric($thisNodeName))
                throw new Exception("cannot parse into xml. remainder :".print_r($input,true));
            if(!(is_array($input) || is_object($input))){
                return "<$thisNodeName>$input</$thisNodeName>";
            }
            else{
                $newNode="<$thisNodeName>";
                foreach($input as $key=>$value){
                    if(is_numeric($key))
                        $key=substr($thisNodeName,0,strlen($thisNodeName)-1);
                    $newNode.=arrayToXml3($key,$value);
                }
                $newNode.="</$thisNodeName>";
                return $newNode;
            }
        }
    
  14. ==============================

    14.

    내가 작업해온 XMLParser를 사용할 수 있습니다.

    $xml = XMLParser::encode(array(
        'bla' => 'blub',
        'foo' => 'bar',
        'another_array' => array (
            'stack' => 'overflow',
        )
    ));
    // @$xml instanceof SimpleXMLElement
    echo $xml->asXML();
    

    결과는 다음과 같습니다.

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

    15.

    나는이 해결책이 원래의 문제와 유사하다는 것을 발견했다.

    <?php
    
    $test_array = array (
      'bla' => 'blub',
      'foo' => 'bar',
      'another_array' => array (
        'stack' => 'overflow',
      ),
    );
    
    class NoSimpleXMLElement extends SimpleXMLElement {
     public function addChild($name,$value) {
      parent::addChild($value,$name);
     }
    }
    $xml = new NoSimpleXMLElement('<root/>');
    array_walk_recursive($test_array, array ($xml, 'addChild'));
    print $xml->asXML();
    
  16. ==============================

    16.

    위의 답변 대부분은 정확합니다. 그러나 array_walk_recursive 호환성 문제와 숫자 키 문제를 해결하는이 대답을 생각해 냈습니다. 그것은 또한 내가 만든 모든 테스트를 통과했습니다.

    function arrayToXML(Array $array, SimpleXMLElement &$xml) {
    
        foreach($array as $key => $value) {
    
            // None array
            if (!is_array($value)) {
                (is_numeric($key)) ? $xml->addChild("item$key", $value) : $xml->addChild($key, $value);
                continue;
            }   
    
            // Array
            $xmlChild = (is_numeric($key)) ? $xml->addChild("item$key") : $xml->addChild($key);
            arrayToXML($value, $xmlChild);
        }
    }   
    

    또한 유용하게 사용할 수있는 테스트 클래스를 추가했습니다.

    class ArrayToXmlTest extends PHPUnit_Framework_TestCase {
    
        public function setUp(){ }
        public function tearDown(){ }
    
        public function testFuncExists() {
            $this->assertTrue(function_exists('arrayToXML'));
        }
    
        public function testFuncReturnsXml() {
            $array = array(
                'name' => 'ardi',
                'last_name' => 'eshghi',
                'age' => 31,
                'tel' => '0785323435'
            );
    
            $xmlEl =  new SimpleXMLElement('<root/>');
            arrayToXml($array, $xmlEl);
    
            $this->assertTrue($xmlEl instanceOf SimpleXMLElement);
        }
    
        public function testAssocArrayToXml() {
    
            $array = array(
                'name' => 'ardi',
                'last_name' => 'eshghi',
                'age' => 31,
                'tel' => '0785323435'
            );
    
            $expectedXmlEl = new SimpleXMLElement('<root/>'); 
            $expectedXmlEl->addChild('name', $array['name']);
            $expectedXmlEl->addChild('last_name', $array['last_name']);
            $expectedXmlEl->addChild('age', $array['age']);
            $expectedXmlEl->addChild('tel', $array['tel']);
    
            $actualXmlEl =  new SimpleXMLElement('<root/>');
            arrayToXml($array, $actualXmlEl);
    
            $this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());
        }
    
        public function testNoneAssocArrayToXml() {
    
            $array = array(
                'ardi',
                'eshghi',
                31,
                '0785323435'
            );
    
            // Expected xml value
            $expectedXmlEl = new SimpleXMLElement('<root/>'); 
            foreach($array as $key => $value)
                $expectedXmlEl->addChild("item$key", $value);
    
            // What the function produces       
            $actualXmlEl =  new SimpleXMLElement('<root/>');
            arrayToXml($array, $actualXmlEl);
    
            $this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());
        }
    
        public function testNestedMixArrayToXml() {
    
            $testArray = array(
                "goal",
                "nice",
                "funny" => array(
                    'name' => 'ardi',
                    'tel'   =>'07415517499',
                    "vary",
                    "fields" => array(
                        'small',
                        'email' => 'ardi.eshghi@gmail.com'
                    ),
    
                    'good old days'
    
                ),
    
                "notes" => "come on lads lets enjoy this",
                "cast" => array(
                    'Tom Cruise',
                    'Thomas Muller' => array('age' => 24)
                )
            );
    
            // Expected xml value
            $expectedXmlEl = new SimpleXMLElement('<root/>'); 
            $expectedXmlEl->addChild('item0', $testArray[0]);
            $expectedXmlEl->addChild('item1', $testArray[1]);
            $childEl = $expectedXmlEl->addChild('funny');
            $childEl->addChild("name", $testArray['funny']['name']);
            $childEl->addChild("tel", $testArray['funny']['tel']);
            $childEl->addChild("item0", "vary");
            $childChildEl = $childEl->addChild("fields");
            $childChildEl->addChild('item0', 'small');
            $childChildEl->addChild('email', $testArray['funny']['fields']['email']);
            $childEl->addChild("item1", 'good old days');
            $expectedXmlEl->addChild('notes', $testArray['notes']);
            $childEl2 = $expectedXmlEl->addChild('cast');
            $childEl2->addChild('item0', 'Tom Cruise');
            $childChildEl2 = $childEl2->addChild('Thomas Muller');
            $childChildEl2->addChild('age', $testArray['cast']['Thomas Muller']['age']);
    
            // What the function produces       
            $actualXmlEl = new SimpleXMLElement('<root/>');
            arrayToXml($testArray, $actualXmlEl);
    
            $this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());
        }
    }      
    
  17. ==============================

    17.

    다른 해결책 :

    $marray=array(....);
    $options = array(
                    "encoding" => "UTF-8",
                    "output_type" => "xml", 
                    "version" => "simple",
                    "escaping" => array("non-ascii, on-print, markup")
                    );
    $xmlres = xmlrpc_encode_request('root', $marray, $options);
    print($xmlres);
    
  18. ==============================

    18.

    배열이 연관되어 올바르게 키잉되어 있다면, 먼저 xml로 바꾸는 것이 더 쉬울 것입니다. 같은 것 :

      function array2xml ($array_item) {
        $xml = '';
        foreach($array_item as $element => $value)
        {
            if (is_array($value))
            {
                $xml .= "<$element>".array2xml($value)."</$element>";
            }
            elseif($value == '')
            {
                $xml .= "<$element />";
            }
            else
            {
                $xml .= "<$element>".htmlentities($value)."</$element>";
            }
        }
        return $xml;
    }
    
    $simple_xml = simplexml_load_string(array2xml($assoc_array));
    

    다른 경로는 기본 XML을 먼저 만드는 것입니다.

    $simple_xml = simplexml_load_string("<array></array>");
    

    그리고 배열의 각 부분에 대해 루프를 만드는 텍스트와 비슷한 것을 사용하고 대신 배열의 각 노드에 대해 "addChild"라는 simplexml 함수를 사용하십시오.

    나중에 그것을 시도하고 두 버전으로이 게시물을 업데이 트합니다.

  19. ==============================

    19.

    위의 함수를 편집하면 키가 숫자 일 때 접두사 "key_"가 추가됩니다.

    // initializing or creating array
    $student_info = array(your array data);
    
    // creating object of SimpleXMLElement
    $xml_student_info = new SimpleXMLElement("<?xml version=\"1.0\"?><student_info></student_info>");
    
    // function call to convert array to xml
    array_to_xml($student,$xml_student_info);
    
    //saving generated xml file
    $xml_student_info->asXML('file path and name');
    
    
    function array_to_xml($student_info, &$xml_student_info) {
         foreach($student_info as $key => $value) {
              if(is_array($value)) {
                if(!is_numeric($key)){
                    $subnode = $xml_student_info->addChild("$key");
                    array_to_xml($value, $subnode);
                }
                else{
                    $subnode = $xml_student_info->addChild("key_$key");
                    array_to_xml($value, $subnode);
                }
              }
              else {
                   if(!is_numeric($key)){
                        $xml_student_info->addChild("$key","$value");
                   }else{
                        $xml_student_info->addChild("key_$key","$value");
                   }
              }
         }
    }
    
  20. ==============================

    20.

    당신은 직접 코드에서 다음과 같은 함수를 사용할 수 있습니다.

        function artoxml($arr, $i=1,$flag=false){
        $sp = "";
        for($j=0;$j<=$i;$j++){
            $sp.=" ";
         }
        foreach($arr as $key=>$val){
            echo "$sp&lt;".$key."&gt;";
            if($i==1) echo "\n";
            if(is_array($val)){
                if(!$flag){echo"\n";}
                artoxml($val,$i+5);
                echo "$sp&lt;/".$key."&gt;\n";
            }else{
                  echo "$val"."&lt;/".$key."&gt;\n";
             }
        }
    
    }
    

    첫 번째 인수를 배열로 사용하고 두 번째 인수는 1이어야하며, 완전한 들여 쓰기를 위해 증가되며 세 번째 인수는 true 여야합니다.

    예를 들어, 변환 할 배열 변수가 $ array1이면, call 함수는

     태그로 캡슐화되어야한다.

    artoxml ($ array1,1, true);

    <및> 기호는 HTML 페이지에 표시되지 않으므로 파일을 실행 한 후 페이지 소스를 참조하십시오.

  21. ==============================

    21.

    function toXML($data, $obj = false, $dom) {
        $is_first_level = false;
        if($obj === false) {
            $dom = new DomDocument('1.0');
            $obj = $dom;
            $is_first_level = true;
        }
    
        if(is_array($data)) {
            foreach($data as $key => $item) {
                $this->toXML($item, $obj->appendChild($dom->createElement($key)), $dom);
            }
        }else {
            $obj->appendChild($dom->createTextNode($data));
        }
    
        if($is_first_level) {
            $obj->formatOutput = true;
            return $obj->saveXML();
        }
        return $obj;
    }
    
  22. ==============================

    22.

    FluidXML을 사용하면 PHP 배열에서 시작하여 SimpleXML 용 XML을 생성 할 수 있습니다. 단지 두 줄의 코드 만 사용하면됩니다.

    $fluidxml  = fluidxml($array);
    $simplexml = simplexml_import_dom($fluidxml->dom());
    

    예제 배열은

    $array = [ 'doc' => [
                  'fruit' => 'orange',
                  'cake'  => [
                       '@id' => '123', 
                       '@'   => 'tiramisu' ],
                  [ 'pasta' => 'matriciana' ],
                  [ 'pasta' => 'boscaiola'  ]
    ] ];
    

    https://github.com/servo-php/fluidxml

  23. ==============================

    23.

    장황한 xml이 문제가되지 않는다면 xmlrpc_encode를 사용하여 배열로부터 xml을 생성 할 수 있습니다. www.php.net/xmlrpc_encode

    연관 및 / 또는 숫자 키를 사용할 경우 생성 된 XML이 다르다는 점에주의하십시오.

    <?php
    // /params/param/value/struct/member
    // there is a tag "member" for each element
    // "member" contains a tag "name". its value is the associative key
    $xml1 = xmlrpc_encode(array('a'=>'b','c'=>'d'));
    $simplexml1 = simplexml_load_string($xml1);
    print_r($xml1);
    print_r($simplexml1);
    
    // /params/param/value/array/data
    // there is a tag "data" for each element
    // "data" doesn't contain the tag "name"
    $xml2 = xmlrpc_encode(array('a','b'));
    $simplexml2 = simplexml_load_string($xml2);
    print_r($xml2);
    print_r($simplexml2);
    ?>
    
  24. ==============================

    24.

    function array2xml($array, $xml = false){
    
        if($xml === false){
    
            $xml = new SimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><'.key($array).'/>');
            $array = $array[key($array)];
    
        }
        foreach($array as $key => $value){
            if(is_array($value)){
                $this->array2xml($value, $xml->addChild($key));
            }else{
                $xml->addChild($key, $value);
            }
        }
        return $xml->asXML();
    }
    
  25. ==============================

    25.

    내 대답, 다른 사람들의 대답을 서로 엮어서. 이것은 숫자 키를 보완하지 못하는 문제를 해결해야합니다 :

    function array_to_xml($array, $root, $element) {
        $xml = new SimpleXMLElement("<{$root}/>");
        foreach ($array as $value) {
            $elem = $xml->addChild($element);
            xml_recurse_child($elem, $value);
        }
        return $xml;
    }
    
    function xml_recurse_child(&$node, $child) {
        foreach ($child as $key=>$value) {
            if(is_array($value)) {
                foreach ($value as $k => $v) {
                    if(is_numeric($k)){
                        xml_recurse_child($node, array($key => $v));
                    }
                    else {
                        $subnode = $node->addChild($key);
                        xml_recurse_child($subnode, $value);
                    }
                }
            }
            else {
                $node->addChild($key, $value);
            }
        }   
    }
    

    array_to_xml () 함수는 먼저 배열이 숫자 키로 구성되어 있다고 가정합니다. 배열에 초기 요소가 있다면 array_to_xml () 함수에서 foreach () 및 $ elem 문을 삭제하고 대신 $ xml을 전달합니다.

  26. ==============================

    26.

    내가 두 번째로 많은 답변을 논평했는데, 구조를 유지하지 못하고 수치 적으로 인덱스 된 내부 배열이 있다면 나쁜 xml을 생성하기 때문이다.

    데이터 구조에 관계없이 json과 xml 사이에 간단한 변환기가 필요하기 때문에이를 기반으로 고유 한 버전을 개발했습니다. 내 버전은 숫자 키 정보와 원래 배열의 구조를 보존합니다. 숫자 키가 들어있는 key-attribute를 사용하여 value -named 요소에 값을 래핑하여 숫자로 인덱싱 된 값의 요소를 만듭니다.

    예를 들어

    array ( 'test'=> 배열 (0 => 'some value', 1 => 'other'))

    ~로 변환하다

    일부 값 기타

    내 버전의 array_to_xml -function (누군가 도움이되기를 바랍니다 :)

    function array_to_xml($arr, &$xml) {
        foreach($arr as $key => $value) {
            if(is_array($value)) {
                if(!is_numeric($key)){
                    $subnode = $xml->addChild("$key");
                } else {
                    $subnode = $xml->addChild("value");
                    $subnode->addAttribute('key', $key);                    
                }
                array_to_xml($value, $subnode);
            }
            else {
                if (is_numeric($key)) {
                    $xml->addChild("value", $value)->addAttribute('key', $key);
                } else {
                    $xml->addChild("$key",$value);
                }
            }
        }
    }   
    
  27. ==============================

    27.

    전체 XML 구조는 $ data에 정의되어 있습니다. Array :

    function array2Xml($data, $xml = null)
    {
        if (is_null($xml)) {
            $xml = simplexml_load_string('<' . key($data) . '/>');
            $data = current($data);
            $return = true;
        }
        if (is_array($data)) {
            foreach ($data as $name => $value) {
                array2Xml($value, is_numeric($name) ? $xml : $xml->addChild($name));
            }
        } else {
            $xml->{0} = $data;
        }
        if (!empty($return)) {
            return $xml->asXML();
        }
    }
    
  28. ==============================

    28.

    magento로 작업하고이 연관 배열 유형을 사용하면

    $test_array = array (
        '0' => array (
                'category_id' => '582',
                'name' => 'Surat',
                'parent_id' => '565',
                'child_id' => '567',
                'active' => '1',
                'level' => '6',
                'position' => '17'
        ),
    
        '1' => array (
                'category_id' => '567', 
                'name' => 'test',
                'parent_id' => '0',
                'child_id' => '576',
                'active' => '0',
                'level' => '0',
                'position' => '18'
        ),
    );
    

    다음이 연관 배열을 xml 형식으로 변환하는 것이 가장 좋습니다. 컨트롤러 파일에서이 코드를 사용합니다.

    $this->loadLayout(false);
    //header ("content-type: text/xml");
    $this->getResponse()->setHeader('Content-Type','text/xml');
    $this->renderLayout();
    
    $clArr2xml = new arr2xml($test_array, 'utf-8', 'listdata');
    $output = $clArr2xml->get_xml();
    print $output; 
    
    class arr2xml
    {
    var $array = array();
    var $xml = '';
    var $root_name = '';
    var $charset = '';
    
    public function __construct($array, $charset = 'utf-8', $root_name = 'root')
    {
        header ("content-type: text/xml");
        $this->array = $array;
        $this->root_name = $root_name;
        $this->charset = $charset;
    
        if (is_array($array) && count($array) > 0) {
            $this->struct_xml($array);
    
        } else {
            $this->xml .= "no data";
        }
    }
    
    public function struct_xml($array)
    {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                $tag = ereg_replace('^[0-9]{1,}', 'item', $k); // replace numeric key in array to 'data'
                $this->xml .= "<$tag>";
                $this->struct_xml($v);
                $this->xml .= "</$tag>";
            } else {
                $tag = ereg_replace('^[0-9]{1,}', 'item', $k); // replace numeric key in array to 'data'
                $this->xml .= "<$tag><![CDATA[$v]]></$tag>";
            }
        }
    }
    
    public function get_xml()
    {
    
        $header = "<?xml version=\"1.0\" encoding=\"" . $this->charset . "\"?><" . $this->root_name . ">";
        $footer = "</" . $this->root_name . ">";
    
        return $header . $this->xml . $footer;
    }
    }
    

    나는 그것이 모두에게 도움이되기를 바랍니다.

  29. ==============================

    29.

    // XML 변환을위한 구조화 된 배열. $ data_array = array (   정렬(     '#xml_tag'=> 'a',     '#xml_value'=> '',     '#tag_attributes'=> 배열 (       정렬(         'name'=> 'a_attr_name',         'value'=> 'a_attr_value',       ),     ),     '#subnode'=> 배열 (       정렬(         '#xml_tag'=> 'aa',         '#xml_value'=> 'aa_value',         '#tag_attributes'=> 배열 (           정렬(             'name'=> 'aa_attr_name',             'value'=> 'aa_attr_value',           ),         ),         '#subnode'=> 거짓,       ),     ),   ),   정렬(     '#xml_tag'=> 'b',     '#xml_value'=> 'b_value',     '#tag_attributes'=> 거짓,     '#subnode'=> 거짓,   ),   정렬(     '#xml_tag'=> 'c',     '#xml_value'=> 'c_value',     '#tag_attributes'=> 배열 (       정렬(         'name'=> 'c_attr_name',         'value'=> 'c_attr_value',       ),       정렬(         'name'=> 'c_attr_name_1',         'value'=> 'c_attr_value_1',       ),     ),     '#subnode'=> 배열 (       정렬(         '#xml_tag'=> 'ca',         '#xml_value'=> 'ca_value',         '#tag_attributes'=> 거짓,         '#subnode'=> 배열 (           정렬(             '#xml_tag'=> 'caa',             '#xml_value'=> 'caa_value',             '#tag_attributes'=> 배열 (               정렬(                 'name'=> 'caa_attr_name',                 'value'=> 'caa_attr_value',               ),             ),             '#subnode'=> 거짓,           ),         ),       ),     ),   ), ); // SimpleXMLElement의 객체 생성 $ xml_object = new SimpleXMLElement ( ' '); // 배열을 xml로 변환하는 함수 호출 array_to_xml ($ data_array, $ xml_object); // 생성 된 XML 파일 저장하기 $ xml_object-> asXML ( '/ tmp / test.xml'); / **  * 구조화 된 PHP 배열을 XML로 변환합니다.  *  * @param 배열 $ data_array  * XML로 변환하기위한 배열 데이터.  * @param Object $ xml_object  * SimpleXMLElement 객체  *  * @see https://gist.github.com/drupalista-br/9230016  *  * / function array_to_xml ($ data_array, & $ xml_object) {   foreach ($ data_array를 $ node로 사용) {     $ subnode = $ xml_object-> addChild ($ node [ '# xml_tag'], $ node [ '# xml_value']);     if ($ node [ '# tag_attributes']) {       foreach ($ node [ '# tag_attributes']를 $ tag_attributes로 사용) {         $ subnode-> addAttribute ($ tag_attributes [ 'name'], $ tag_attributes [ 'value']);       }     }     if ($ node [ '# subnode']) {       array_to_xml ($ node [ '# subnode'], $ subnode);     }   } }

  30. ==============================

    30.

    다음은 네임 스페이스를 다룬다. 이 경우 네임 스페이스 정의를 포함하는 래퍼를 생성하여 함수에 전달합니다. 콜론을 사용하여 네임 스페이스를 식별하십시오.

    배열 테스트

    $inarray = [];
    $inarray['p:apple'] = "red";
    $inarray['p:pear'] = "green";
    $inarray['p:peach'] = "orange";
    $inarray['p1:grocers'] = ['p1:local' => "cheap", 'p1:imported' => "expensive"];
    
    
    $xml = new SimpleXMLElement( '<p:wrapper xmlns:p="http://namespace.org/api" xmlns:p1="http://namespace.org/api2 /> ');
    
    array_to_xml($xml,$inarray); 
    
    
    
    
    function array_to_xml(SimpleXMLElement $object, array $data)
    {   
        $nslist = $object->getDocNamespaces();
    
        foreach ($data as $key => $value)
        {   
            $nspace = null;
            $keyparts = explode(":",$key,2);
            if ( count($keyparts)==2) 
                $nspace = $nslist[$keyparts[0]];
    
            if (is_array($value))
            {   
                $key = is_numeric($key) ? "item$key" : $key;
                $new_object = $object->addChild($key,null,$nspace);
                array_to_xml($new_object, $value);
            }   
            else
            {   
                $key = is_numeric($key) ? "item$key" : $key;
                $object->addChild($key, $value,$nspace);
            }   
        }   
    }   
    
  31. from https://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml by cc-by-sa and MIT lisence