PHP对象作为XML文档
时间:2020-03-06 14:45:30 来源:igfitidea点击:
采取给定PHP对象并将其序列化为XML的最佳方法是什么?我正在查看simple_xml,并用它来将XML解析为对象,但是我不清楚它是如何工作的。
解决方案
使用dom函数可以做到这一点:
http://www.php.net/manual/zh/function.dom-import-simplexml.php
导入SimpleXML对象,然后保存。上面的链接包含一个示例。 :)
简而言之:
<?php $array = array('hello' => 'world', 'good' => 'morning'); $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><foo />"); foreach ($array as $k=>$v) { $xml->addChild($k, $v); } ?>
好吧,虽然有点脏,但我们始终可以在对象的属性上运行一个循环...
$_xml = ''; foreach($obj as $key => $val){ $_xml .= '<' . $key . '>' . $val . '</' . $key . ">\n"; }
使用fopen / fwrite / fclose可以生成带有$ _xml变量作为内容的XML文档。很难看,但是可以用。
看一下PEAR的XML_Serializer包。我用它取得了很好的效果。我们可以向其提供数组,对象等,并将它们转换为XML。它还有很多选项,例如选择根节点的名称等。
应该做的把戏
使用WDDX:
http://uk.php.net/manual/zh/wddx.examples.php
(如果已安装此扩展程序)
它致力于:
http://www.openwddx.org/
并不是对原始问题的答案,但是我解决此问题的方法是通过将对象声明为:
$root = '<?xml version="1.0" encoding="UTF-8"?><Activities/>'; $object = new simpleXMLElement($root);
相对于:
$object = new stdClass;
在我开始添加任何值之前!
我同意使用PEAR的XML_Serializer,但是如果我们想要一些简单的东西来支持嵌套了属性的对象/数组,则可以使用它。
class XMLSerializer { // functions adopted from http://www.sean-barton.co.uk/2009/03/turning-an-array-or-object-into-xml-using-php/ public static function generateValidXmlFromObj(stdClass $obj, $node_block='nodes', $node_name='node') { $arr = get_object_vars($obj); return self::generateValidXmlFromArray($arr, $node_block, $node_name); } public static function generateValidXmlFromArray($array, $node_block='nodes', $node_name='node') { $xml = '<?xml version="1.0" encoding="UTF-8" ?>'; $xml .= '<' . $node_block . '>'; $xml .= self::generateXmlFromArray($array, $node_name); $xml .= '</' . $node_block . '>'; return $xml; } private static function generateXmlFromArray($array, $node_name) { $xml = ''; if (is_array($array) || is_object($array)) { foreach ($array as $key=>$value) { if (is_numeric($key)) { $key = $node_name; } $xml .= '<' . $key . '>' . self::generateXmlFromArray($value, $node_name) . '</' . $key . '>'; } } else { $xml = htmlspecialchars($array, ENT_QUOTES); } return $xml; } }