[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_recursive
PHP 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');
?>
답변
여기에 제공된 답변은 배열을 노드가있는 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');