如何将数组转换为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_walk之前用array_flip()
修复它。 array_walk_recursive
需要PHP 5.你可以使用array_walk
,但是在xml中你不会得到'stack' => 'overflow'
。
这里是PHP 5.2的代码,将任何深度的数组转换为XML文档:
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
文档
这里提供的答案只是将数组转换为带有节点的XML,您无法设置属性。 我已经写了一个PHP函数,允许您将数组转换为PHP,也可以为XML中的特定节点设置属性。 这里的缺点是你必须以一个特定的方式构build一个数组,只有很less的约定(只有当你想使用属性)
以下示例将允许您在XML中设置属性。
详细的例子和用法可以在这里find: 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> */ ?>
<?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 = array( 'bla'=>'blub', 'foo'=>'bar', 'another_array'=>数组( 'stack'=>'溢出', ) ); echo array_to_xml($ test_array,new SimpleXMLElement('<root />')) - > asXML();
我发现所有的答案使用了太多的代码。 这是一个简单的方法来做到这一点:
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); } } }
然后,将数组发送到使用recursion的函数是一个简单的事情,所以它将处理一个multidimensional array:
$xml = new SimpleXMLElement('<rootTag/>'); to_xml($xml, $my_array);
现在,$ xml包含一个美丽的XML对象,基于你的数组,完全是你写的。
print $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');
从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(); }
这里是我的入门,简单而干净..
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);
所以无论如何…我采取了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(); ?>
我使用了一些函数,我写了一段时间来生成xml来从PHP和jQuery等来回传递。既不使用任何额外的框架,只是纯粹生成一个string,然后可以使用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; }
爱到所有:)
我想要一个代码,将采取一个数组内的所有元素,并将其视为属性,所有数组作为子元素。
所以对于类似的东西
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>
为了达到这个代码如下,但要非常小心,这是recursion的,可能实际上会导致一个stackoverflow 🙂
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(); }
您可能需要添加对数组长度的检查,以便某些元素在数据部分内部设置,而不是作为属性设置。
这是一个function,为我做的伎俩:
只是用类似的东西来调用它
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; } }
你可以使用我一直在使用的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>
我发现这个解决scheme类似于原来的问题
<?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();
大多数上述答案是正确的。 不过,我想出了这个解决array_walk_recursive兼容性问题,也是数字键问题的答案。 它也通过了我所做的所有testing:
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); } }
我也添加了一个testing类,你可能会发现它有用:
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()); } }
其他scheme:
$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);
如果数组是正确关联和键入的,那么先将它转换成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));
其他的路线是先创build你的基本xml,比如
$simple_xml = simplexml_load_string("<array></array>");
然后对于数组的每个部分,使用类似于我的文本创build循环的东西,而是对数组中的每个节点使用simplexml函数“addChild”。
我会稍后尝试,并更新这两个版本的post。
只需要编辑上面的函数,当一个键是数字时,添加一个前缀“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"); } } } }
基于这里的所有内容,通过用@
加前缀处理数字索引+属性,并且可以将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>
奖金:格式化XML
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
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; }
<RoomGroup> <Room> <numberOfAdults>1</numberOfAdults> <numberOfChildren>2</numberOfChildren> <childAges>1,2,0</childAges> </Room> <Room> <numberOfAdults>2</numberOfAdults> <numberOfChildren>0</numberOfChildren> <childAges>1,2,0</childAges> </Room> </RoomGroup>
我想同样的节点名称“房间”,同时将PHP转换为XML。 在这里,我发现它。 http://www.codeproject.com/Questions/553031/JSONplusTOplusXMLplusconvertionpluswithplusphp
使用FluidXML,您可以从PHP Array开始 ,为SimpleXML生成XML,只需两行代码。
$fluidxml = fluidxml($array); $simplexml = simplexml_import_dom($fluidxml->dom());
一个示例数组可能是
$array = [ 'doc' => [ 'fruit' => 'orange', 'cake' => [ '@id' => '123', '@' => 'tiramisu' ], [ 'pasta' => 'matriciana' ], [ 'pasta' => 'boscaiola' ] ] ];
如果详细的xml不是问题,你可以使用xmlrpc_encode从数组中创build一个xml。 http://www.php.net/xmlrpc_encode
在使用关联和/或数字键的情况下,要小心xml创build的不同
<?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); ?>
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(); }
将xml数据转换为数组php的示例
function xml_to_array ($xml_data) { $p = xml_parser_create(); xml_parse_into_struct($p,$xml_data,$vals,$index); xml_parser_free($p); return $vals; }
请参阅此链接了解更多信息。
我的回答是把他人的答案拼凑在一起。 这应该纠正为数字键的失败补偿:
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
。
我会评论第二个最票的答案,因为它不保留结构,并产生不良的XML,如果有数字索引的内部数组。
我基于它开发了我自己的版本,因为无论数据的结构如何,我都需要在json和xml之间进行简单的转换。 我的版本保留原始数组的数字键信息和结构。 它通过使用包含数字键的key-attribute将值包装到value -named元素来为数值索引值创build元素。
例如
array('test' => array(0 => 'some value', 1 => 'other'))
转换为
<test><value key="0">some value</value><value key="1">other</value></test>
我的版本的array_to_xmlfunction(希望它有助于某人:)
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); } } } }
你可以直接在你的代码中使用下面的函数,
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,这将增加完美的缩进,第三个必须是真实的。
例如,如果要转换的数组variables是$ array1,那么调用应该是,调用函数应该用<pre>
标记封装。
artoxml($ array1,1,真正的);
执行文件后请看页面源码,因为<和>符号不会显示在html页面中。
整个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(); } }
如果你在magento工作,你有这种types的关联数组
$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; } }
我希望这对所有人都有帮助。