将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);
}

