将PHP关联数组与XML相互传递
是否有一种简单的方法可以将PHP关联数组与XML进行封送处理?例如,我有以下数组:
$items = array("1", "2", array( "item3.1" => "3.1", "item3.2" => "3.2" "isawesome" => true ) );
我如何在尽可能少的行中将其转换为类似于以下XML的内容,然后再次返回?
<items> <item>1</item> <item>2</item> <item> <item3_1>3.1</item3_1> <item3_2>3.2</item3_2> <isawesome>true</isawesome> </item> </items>
我真的不在乎是否需要稍微更改数组结构,或者输出的XML是否与上面的示例不同。我一直在尝试使用PHP的XMLReader和XMLWriter,但是文档非常糟糕,因此生成的代码看起来与我的感觉不一样:
$xml = SomeXMLWriter::writeArrayToXml($items); $array = SomeXMLWriter::writeXmlToArray($xml);
在不编写自己的自定义类的情况下,获取PHP数组的基本原始XML转储真的比这难吗?
我尽量避免梨。除了配置方面的麻烦之外,我从未使用过使用过的任何软件包。
解决方案
我们是否看到过PEAR包XML_Serializer?
pear_php_XML_Serializer
SimpleXML非常适合我们使用。
通常尝试Zend_Config和Zend Framework。
我想这将是一个两步过程:将数组转换为Zend_Config,将Zend_Config转换为XML。
听起来像SimpleXML的工作。
我建议使用稍微不同的XML结构。
并想知道为什么需要从数组转换-> XML并返回。如果我们可以按照我们所说的那样修改数组结构,为什么不只生成XML?如果已经存在采用该数组配置的某些代码,则只需对其进行修改以接受XML。那么我们就有了1种数据格式/输入类型,并且根本不需要转换。
<items> <item id="1"/> <item id="2"/> <item id="3"> <subitems> <item id="3.1"/> <item id="3.2" isawesome="true"/> </subitems> </item> </items>
我同意这是PHP文档下降的一个领域,但是对我来说,我一直将SimpleXML与xml2Array函数之类的东西混合使用。在诸如print_r之类的转储功能的帮助下,从simpleXML获得的Xml并不难导航。
我遇到了一些相同的问题,因此我创建了两个类:
bXml
扩展SimpleXml并更正其某些问题的类。就像无法添加CData节点或者Comment节点一样。我还添加了一些其他功能,例如使用php流功能来添加子节点$ oXml-> AddChild(" file:///user/data.xml")或者添加XML字符串子节点,例如$ oXml-> AddChild(" <more> <xml> yes </ xml> </ more>"))`,但基本上我只是想解决simpleXML问题。
数组
我扩展了ArrayObject类,以便所有数组功能都可以面向对象且一致,因此我们无需记住array_walk按引用对数组进行操作,而array_filter按值对数组进行操作。因此,我们可以执行类似$ oArray-> flip()-> Reverse()-> Walk(/ * callback * /);之类的操作,然后仍以与通常使用$ oArray [key]相同的方式访问该值。
两种方法都将自己输出为Arrays和Xml,因此我们可以在它们之间无缝切换。因此,我们可以$ oXml-> AsArray();
或者$ oArray-> AsXml();
我发现,这样做比在array2xml或者xml2array方法之间不断地传递数据要容易得多。
http://code.google.com/p/blibrary/source
可以重写这两个类以创建我们选择的自定义类,并且可以彼此独立使用。
下面的类使用simplexml来实现相同的功能,我们只需要遍历数组并调用ximplexml的addchild。
http://snipplr.com/view.php?codeview&id=3491
对于那些不使用PEAR软件包但已安装PHP5的用户。这为我工作:
/** * Build A XML Data Set * * @param array $data Associative Array containing values to be parsed into an XML Data Set(s) * @param string $startElement Root Opening Tag, default fx_request * @param string $xml_version XML Version, default 1.0 * @param string $xml_encoding XML Encoding, default UTF-8 * @return string XML String containig values * @return mixed Boolean false on failure, string XML result on success */ public function buildXMLData($data, $startElement = 'fx_request', $xml_version = '1.0', $xml_encoding = 'UTF-8') { if(!is_array($data)) { $err = 'Invalid variable type supplied, expected array not found on line '.__LINE__." in Class: ".__CLASS__." Method: ".__METHOD__; trigger_error($err); if($this->_debug) echo $err; return false; //return false error occurred } $xml = new XmlWriter(); $xml->openMemory(); $xml->startDocument($xml_version, $xml_encoding); $xml->startElement($startElement); /** * Write XML as per Associative Array * @param object $xml XMLWriter Object * @param array $data Associative Data Array */ function write(XMLWriter $xml, $data) { foreach($data as $key => $value) { if(is_array($value)) { $xml->startElement($key); write($xml, $value); $xml->endElement(); continue; } $xml->writeElement($key, $value); } } write($xml, $data); $xml->endElement();//write end element //Return the XML results return $xml->outputMemory(true); }