将PHP关联数组与XML相互传递

时间:2020-03-06 14:24:34  来源:igfitidea点击:

是否有一种简单的方法可以将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); 
}