ฉันจะแปลงอาร์เรย์เป็นวัตถุ SimpleXML ใน PHP ได้อย่างไร
ฉันจะแปลงอาร์เรย์เป็นวัตถุ SimpleXML ใน PHP ได้อย่างไร
คำตอบ:
สั้น ๆ :
<?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 แล้ว
array_flip
จะไม่ทำงานในขณะที่มันไม่สามารถพลิกอาร์เรย์ (เช่นanother_array
ภายในอาร์เรย์หลัก)
array_flip
ใช้ได้เฉพาะในกรณีที่ไม่มีค่าที่เหมือนกัน
นี่คือโค้ด 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_array($value) ) {
if( is_numeric($key) ){
$key = 'item'.$key; //dealing with <0/>..<n/> issues
}
$subnode = $xml_data->addChild($key);
array_to_xml($value, $subnode);
} else {
$xml_data->addChild("$key",htmlspecialchars("$value"));
}
}
}
// initializing or creating array
$data = array('total_stud' => 500);
// creating object of SimpleXMLElement
$xml_data = new SimpleXMLElement('<?xml version="1.0"?><data></data>');
// function call to convert array to xml
array_to_xml($data,$xml_data);
//saving generated xml file;
$result = $xml_data->asXML('/file/path/name.xml');
?>
เอกสารเกี่ยวกับการSimpleXMLElement::asXML
ใช้งานในข้อมูลโค้ดนี้
คำตอบที่ให้ไว้ที่นี่จะแปลงอาร์เรย์เป็น XML ด้วยโหนดเท่านั้นคุณจะไม่สามารถตั้งค่าแอตทริบิวต์ได้ ฉันได้เขียนฟังก์ชัน php ที่ช่วยให้คุณแปลงอาร์เรย์เป็น php และตั้งค่าคุณลักษณะสำหรับโหนดเฉพาะใน xml ข้อเสียของที่นี่คือคุณต้องสร้างอาเรย์ด้วยวิธีการเฉพาะโดยมีข้อตกลงเล็กน้อย (เฉพาะในกรณีที่คุณต้องการใช้แอททริบิวต์)
ตัวอย่างต่อไปนี้จะช่วยให้คุณสามารถตั้งค่าแอตทริบิวต์ใน 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>
*/
?>
if(!is_array($arr)) {
ไปif(!is_array($arr) && $arr !== '') {
เพื่อที่จะไม่ได้ผนวกโหนดข้อความใหม่สำหรับสตริงที่ว่างเปล่าและดังนั้นจึงช่วยให้จดชวเลขรูปแบบแท็กที่ว่างเปล่าเช่น'tag'=>''
เป็น<tag/>
แทน<tag></tag>
ฉันพบคำตอบทั้งหมดเพื่อใช้รหัสมากเกินไป นี่เป็นวิธีง่ายๆในการทำ:
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();
if ( is_numeric( $key ) ) $key = "numeric_$key";
ถึงแม้ว่ามันจะดีที่จะเพิ่มการทดสอบบนแป้นตัวเลขเช่น:
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rootTag/>');
เข้ารหัส UTF-8 ที่ถูกต้อง
$object->addChild($key, $value);
เป็น$object->addChild($key, htmlspecialchars($value));
เพื่อป้องกันไม่ให้ล้มเหลวเมื่อค่า $ มีอักขระเช่น "&" ที่ต้องการการเข้ารหัส XML
<php? ฟังก์ชัน array_to_xml (อาร์เรย์ $ arr, SimpleXMLElement $ xml) { foreach ($ arr เป็น $ k => $ v) { is_array ($ V) ? array_to_xml ($ v, $ xml-> addChild ($ k)) : $ xml-> addChild ($ k, $ v); } ส่งคืน $ xml; } $ test_array = อาร์เรย์ ( 'bla' => 'blub' 'foo' => 'บาร์' 'another_array' => อาร์เรย์ ( 'stack' => 'ล้น' ) ); echo array_to_xml ($ test_array, SimpleXMLElement ใหม่ ('<root />')) -> asXML ();
$k = (is_numeric($k)) ? 'item' : $k;
ภายในforeach()
จาก 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');
นี่คือรายการของฉันเรียบง่ายและสะอาด ..
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();
?>
if (is_numeric($k)) { $i = $k + 1; $child = $xml->addChild("_$i"); array_to_xml($v, $child); }
ฉันใช้ฟังก์ชั่นสองอย่างที่ฉันเขียนสักครู่เพื่อสร้าง xml เพื่อส่งผ่านไปมาจาก PHP และ jQuery ฯลฯ ... ไม่ใช้เฟรมเวิร์กเพิ่มเติมใด ๆ เพียงแค่สร้างสตริงที่สามารถใช้กับ 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>
เพื่อให้ได้รหัสนี้อยู่ด้านล่าง แต่ระวังให้ดีรหัสซ้ำและอาจทำให้เกิดการซ้อนทับจริง :)
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();
}
คุณอาจต้องการเพิ่มการตรวจสอบความยาวของอาร์เรย์เพื่อให้องค์ประกอบบางอย่างได้รับการตั้งค่าภายในส่วนข้อมูลและไม่ได้เป็นคุณลักษณะ
ขึ้นอยู่กับทุกสิ่งที่นี่จัดการดัชนี + แอตทริบิวต์ผ่านการเติมคำนำหน้าด้วย@
และสามารถฉีด 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
นี่คือฟังก์ชั่นที่หลอกลวงสำหรับฉัน:
เพียงแค่เรียกมันด้วยสิ่งที่ชอบ
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>
ฉันพบวิธีแก้ปัญหานี้คล้ายกับปัญหาดั้งเดิม
<?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 และปัญหาของปุ่มตัวเลข มันผ่านการทดสอบทั้งหมดที่ฉันทำ:
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());
}
}
วิธีการแก้ปัญหาอื่น ๆ :
$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));
เส้นทางอื่นคือการสร้าง XML พื้นฐานของคุณก่อนเช่น
$simple_xml = simplexml_load_string("<array></array>");
จากนั้นสำหรับแต่ละส่วนของอาเรย์ของคุณใช้สิ่งที่คล้ายกับลูปการสร้างข้อความของฉันและใช้ฟังก์ชั่น simplexml "addChild" สำหรับแต่ละโหนดของอาเรย์
ฉันจะลองดูในภายหลังและอัปเดตโพสต์นี้ด้วยทั้งสองเวอร์ชัน
เพียงแก้ไขในฟังก์ชั่นด้านบนเมื่อคีย์เป็นตัวเลขให้เพิ่มคำนำหน้า "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");
}
}
}
}
คุณสามารถใช้ฟังก์ชั่นต่อไปนี้ในรหัสของคุณโดยตรง
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 ซึ่งจะเพิ่มขึ้นสำหรับการเยื้องที่สมบูรณ์แบบและอันดับที่สามต้องเป็นจริง
ตัวอย่างเช่นหากตัวแปรอาร์เรย์ที่จะแปลงเป็น $ array1 ดังนั้นการเรียกจะเป็นฟังก์ชันการเรียกควรถูกห่อหุ้มด้วย<pre>
แท็ก
artoxml ($ array1,1 จริง);
โปรดดูแหล่งที่มาของหน้าหลังจากเรียกใช้งานไฟล์เพราะสัญลักษณ์ <และ> จะไม่ปรากฏในหน้า html
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;
}
function array2xml(array $data, SimpleXMLElement $object = null, $oldNodeName = 'item')
{
if (is_null($object)) $object = new SimpleXMLElement('<root/>');
$isNumbered = true;
$idx = 0;
foreach ($data as $key => $x)
if (is_string($key) || ($idx++ != $key + 0))
$isNumbered = false;
foreach ($data as $key => $value)
{
$attribute = preg_match('/^[0-9]/', $key . '') ? $key : null;
$key = (is_string($key) && !preg_match('/^[0-9]/', $key . '')) ? $key : preg_replace('/s$/', '', $oldNodeName);
if (is_array($value))
{
$new_object = $object->addChild($key);
if (!$isNumbered && !is_null($attribute)) $new_object->addAttribute('id', $attribute);
array2xml($value, $new_object, $key);
}
else
{
if (is_bool($value)) $value = $value ? 'true' : 'false';
$node = $object->addChild($key, htmlspecialchars($value));
if (!$isNumbered && !is_null($attribute) && !isset($node->attributes()->id))
$node->addAttribute('id', $attribute);
}
}
return $object;
}
ฟังก์ชันนี้ส่งคืนตัวอย่างรายการ <obj>...</obj> <obj> ... </obj> แท็ก XML สำหรับดัชนีตัวเลข
การป้อนข้อมูล:
array(
'people' => array(
'dog',
'cat',
'life' => array(
'gum',
'shoe',
),
'fish',
),
array('yeah'),
)
เอาท์พุท:
<root>
<people>
<people>dog</people>
<people>cat</people>
<life>
<life>gum</life>
<life>shoe</life>
</life>
<people>fish</people>
<people>
<people>yeah</people>
</people>
</people>
</root>
สิ่งนี้ควรตอบสนองความต้องการทั่วไปทั้งหมด บางทีคุณอาจเปลี่ยนบรรทัดที่ 3 เป็น:
$key = is_string($key) ? $key : $oldNodeName . '_' . $key;
หรือถ้าคุณกำลังทำงานกับพหูพจน์ที่ลงท้ายด้วย s:
$key = is_string($key) ? $key : preg_replace('/s$/', '', $oldNodeName);
ด้วยFluidXMLคุณสามารถสร้างเริ่มต้นจากPHP Array , XML สำหรับSimpleXMLด้วย ... เพียงสองบรรทัดของโค้ด
$fluidxml = fluidxml($array);
$simplexml = simplexml_import_dom($fluidxml->dom());
อาร์เรย์ตัวอย่างอาจเป็น
$array = [ 'doc' => [
'fruit' => 'orange',
'cake' => [
'@id' => '123',
'@' => 'tiramisu' ],
[ 'pasta' => 'matriciana' ],
[ 'pasta' => 'boscaiola' ]
] ];
คุณอาจใช้ xmlrpc_encode เพื่อสร้าง xml จากอาร์เรย์หาก verbose 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);
?>
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();
}
คำตอบของฉันคือคำตอบของคนอื่น สิ่งนี้ควรแก้ไขสำหรับความล้มเหลวในการชดเชยคีย์ตัวเลข:
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()
presumes ฟังก์ชั่นที่อาร์เรย์ถูกสร้างขึ้นจากแผงปุ่มกดตัวเลขแรก ถ้าอาเรย์ของคุณมีองค์ประกอบเริ่มต้นคุณจะปล่อยforeach()
และ$elem
คำสั่งจากarray_to_xml()
ฟังก์ชั่นและเพียงผ่าน$xml
แทน
ฉันจะให้ความเห็นคำตอบที่โหวตมากที่สุดเป็นอันดับสองเพราะมันไม่ได้รักษาโครงสร้างและสร้าง XML ที่ไม่ดีหากมีอาร์เรย์ภายในที่จัดทำดัชนีเป็นตัวเลข
ฉันพัฒนาเวอร์ชันของฉันเองเพราะฉันต้องการตัวแปลงอย่างง่ายระหว่าง json และ xml โดยไม่คำนึงถึงโครงสร้างของข้อมูล เวอร์ชันของฉันเก็บรักษาข้อมูลคีย์ตัวเลขและโครงสร้างของอาร์เรย์ดั้งเดิม มันสร้างองค์ประกอบสำหรับค่าการจัดทำดัชนีตัวเลขโดยการตัดค่าให้กับองค์ประกอบที่มีค่าชื่อด้วยคีย์ - แอตทริบิวต์ที่มีคีย์ตัวเลข
ตัวอย่างเช่น
array('test' => array(0 => 'some value', 1 => 'other'))
แปลงเป็น
<test><value key="0">some value</value><value key="1">other</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);
}
}
}
}
โครงสร้าง 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();
}
}
หากคุณทำงานในวีโอไอพีและคุณมีอาเรย์แบบนี้
$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;
}
}
ฉันหวังว่ามันจะช่วยให้ทุกคน
// Structered array for XML convertion.
$data_array = array(
array(
'#xml_tag' => 'a',
'#xml_value' => '',
'#tag_attributes' => array(
array(
'name' => 'a_attr_name',
'value' => 'a_attr_value',
),
),
'#subnode' => array(
array(
'#xml_tag' => 'aa',
'#xml_value' => 'aa_value',
'#tag_attributes' => array(
array(
'name' => 'aa_attr_name',
'value' => 'aa_attr_value',
),
),
'#subnode' => FALSE,
),
),
),
array(
'#xml_tag' => 'b',
'#xml_value' => 'b_value',
'#tag_attributes' => FALSE,
'#subnode' => FALSE,
),
array(
'#xml_tag' => 'c',
'#xml_value' => 'c_value',
'#tag_attributes' => array(
array(
'name' => 'c_attr_name',
'value' => 'c_attr_value',
),
array(
'name' => 'c_attr_name_1',
'value' => 'c_attr_value_1',
),
),
'#subnode' => array(
array(
'#xml_tag' => 'ca',
'#xml_value' => 'ca_value',
'#tag_attributes' => FALSE,
'#subnode' => array(
array(
'#xml_tag' => 'caa',
'#xml_value' => 'caa_value',
'#tag_attributes' => array(
array(
'name' => 'caa_attr_name',
'value' => 'caa_attr_value',
),
),
'#subnode' => FALSE,
),
),
),
),
),
);
// creating object of SimpleXMLElement
$xml_object = new SimpleXMLElement('<?xml version=\"1.0\"?><student_info></student_info>');
// function call to convert array to xml
array_to_xml($data_array, $xml_object);
// saving generated xml file
$xml_object->asXML('/tmp/test.xml');
/**
* Converts an structured PHP array to XML.
*
* @param Array $data_array
* The array data for converting into XML.
* @param Object $xml_object
* The SimpleXMLElement Object
*
* @see https://gist.github.com/drupalista-br/9230016
*
*/
function array_to_xml($data_array, &$xml_object) {
foreach($data_array as $node) {
$subnode = $xml_object->addChild($node['#xml_tag'], $node['#xml_value']);
if ($node['#tag_attributes']) {
foreach ($node['#tag_attributes'] as $tag_attributes) {
$subnode->addAttribute($tag_attributes['name'], $tag_attributes['value']);
}
}
if ($node['#subnode']) {
array_to_xml($node['#subnode'], $subnode);
}
}
}