배열을 SimpleXML로 변환하는 방법
PHP배열을 SimpleXML로 변환하는 방법
PHP에서 배열을 SimpleXML 객체로 변환하려면 어떻게해야합니까?
해결법
-
==============================
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.
다음은 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.
여기에 제공된 대답은 노드가있는 배열 만 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.
너무 많은 코드를 사용하는 모든 답변을 찾았습니다. 다음과 같이 쉽게 할 수 있습니다.
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.
<?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.
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.
또 다른 개선점 :
/** * 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.
여기 내 입장, 간단하고 깨끗한 ..
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.
그래서 어쨌든 ... 나는 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.
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.
배열 안의 모든 요소를 취하여 속성으로 처리하고 모든 배열을 하위 요소로 처리하는 코드가 필요했습니다.
그래서
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.
여기에있는 모든 것을 기반으로 @ 접두어로 숫자 인덱스 + 속성을 처리하고 기존 노드에 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.
나를 위해 트릭을 한 기능은 다음과 같습니다.
그냥 전화 해.
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.
내가 작업해온 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.
나는이 해결책이 원래의 문제와 유사하다는 것을 발견했다.
<?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.
위의 답변 대부분은 정확합니다. 그러나 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.
다른 해결책 :
$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.
배열이 연관되어 올바르게 키잉되어 있다면, 먼저 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.
위의 함수를 편집하면 키가 숫자 일 때 접두사 "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.
당신은 직접 코드에서 다음과 같은 함수를 사용할 수 있습니다.
function artoxml($arr, $i=1,$flag=false){ $sp = ""; for($j=0;$j<=$i;$j++){ $sp.=" "; } foreach($arr as $key=>$val){ echo "$sp<".$key.">"; if($i==1) echo "\n"; if(is_array($val)){ if(!$flag){echo"\n";} artoxml($val,$i+5); echo "$sp</".$key.">\n"; }else{ echo "$val"."</".$key.">\n"; } } }
첫 번째 인수를 배열로 사용하고 두 번째 인수는 1이어야하며, 완전한 들여 쓰기를 위해 증가되며 세 번째 인수는 true 여야합니다.
예를 들어, 변환 할 배열 변수가 $ array1이면, call 함수는
태그로 캡슐화되어야한다.
artoxml ($ array1,1, true);
<및> 기호는 HTML 페이지에 표시되지 않으므로 파일을 실행 한 후 페이지 소스를 참조하십시오.
-
==============================
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.
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.
장황한 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.
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.
내 대답, 다른 사람들의 대답을 서로 엮어서. 이것은 숫자 키를 보완하지 못하는 문제를 해결해야합니다 :
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.
내가 두 번째로 많은 답변을 논평했는데, 구조를 유지하지 못하고 수치 적으로 인덱스 된 내부 배열이 있다면 나쁜 xml을 생성하기 때문이다.
데이터 구조에 관계없이 json과 xml 사이에 간단한 변환기가 필요하기 때문에이를 기반으로 고유 한 버전을 개발했습니다. 내 버전은 숫자 키 정보와 원래 배열의 구조를 보존합니다. 숫자 키가 들어있는 key-attribute를 사용하여 value -named 요소에 값을 래핑하여 숫자로 인덱싱 된 값의 요소를 만듭니다.
예를 들어
array ( 'test'=> 배열 (0 => 'some value', 1 => 'other'))
~로 변환하다
일부 값 value> 기타 value> test> 내 버전의 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.
전체 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.
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.
// 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 version = \ "1.0 \"?>
student_info>'); // 배열을 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.
다음은 네임 스페이스를 다룬다. 이 경우 네임 스페이스 정의를 포함하는 래퍼를 생성하여 함수에 전달합니다. 콜론을 사용하여 네임 스페이스를 식별하십시오.
배열 테스트
$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); } } }
from https://stackoverflow.com/questions/1397036/how-to-convert-array-to-simplexml by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PHP + MySQL 트랜잭션 예제 (0) | 2018.09.03 |
---|---|
모든 오류 및 경고 표시 (0) | 2018.09.03 |
preg_replace () e 수정자를 preg_replace_callback으로 바꾸십시오. (0) | 2018.09.03 |
PHP + 컬, HTTP POST 샘플 코드? (0) | 2018.09.03 |
PHP를 사용하여 cron 작업을 만드는 방법은 무엇입니까? (0) | 2018.09.03 |