龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

XML 转成 数组对象

时间:2014-07-22 14:51来源: 作者: 点击:
分享到:
将XML内容解析后返回一个对应的数组对象,并且可以通过参数设置来设置返回类型【数组、JSON】 默认:数组 br / span style=background-color:#ffe500;由于是基于simplexml_load_string 对带有命名空间的
将XML内容解析后返回一个对应的数组对象,并且可以通过参数设置来设置返回类型【数组、JSON】 默认:数组
由于是基于simplexml_load_string 对带有命名空间的XML解析不是很好,会丢失命名空间内容 以上是在测试中得到的结论,后续版本会解决这个问题。
这个可以满足一般的使用需求
function toJSON()
{
    require_once '../classes/XmlToArray.php';
    $XML=<<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- struts2委托spring管理 -->
    <constant name="struts.objectFactory" value="spring"/>
    <!-- /crm/emp/add.action -->
    <package name="crm_employee" extends="struts-default" namespace="/emp">
        <action name="add" class="addBean" method="add">
            <result>add.action</result>
            <result>/emp/add_suc.jsp</result>
        </action>
        <action name="list" class="listBean" method="list">
            <result>/emp/list.jsp</result>
        </action>
        <action name="delete" class="deleteBean" method="delete">
            <result>delete.action</result>
            <result>/emp/delete_suc.jsp</result>
        </action>
        <action name="update" class="updateBean" method="update">
            <result>update.action</result>
            <result>/emp/edit_suc.jsp</result>
        </action>
        <action name="edit" class="editBean" method="edit">
            <result>/emp/edit.jsp</result>
        </action>
        <!-- Add actions here -->
    </package>
</struts>

XML;

    header("Content-type: text/html; charset=utf-8") ;
    $xml_to_array = new XmlToArray();
    $xml_to_array->setXml($XML);
    // 当标签名与内置属性有冲突的时候可以自定义相关属性名,一般其概况不需要设置
    //$xml_to_array->setAttributeAsName("attributeAsName")->setContentAsName("contentasName");
    $r = $xml_to_array->parseXml(true);
     print_r( $r ) ;
}
// 打印结果:

{"struts":{"attributes":[],"content":"","constant":{"attributes":{"name":"struts.objectFactory","value":"spring"},"content":""},"package":{"attributes":{"name":"crm_employee","extends":"struts-default","namespace":"\/emp"},"content":"","action":[{"attributes":{"name":"add","class":"addBean","method":"add"},"content":"","result":[{"attributes":[],"content":"add.action"},{"attributes":[],"content":"\/emp\/add_suc.jsp"}]},{"attributes":{"name":"list","class":"listBean","method":"list"},"content":"","result":{"attributes":[],"content":"\/emp\/list.jsp"}},{"attributes":{"name":"delete","class":"deleteBean","method":"delete"},"content":"","result":{"attributes":[],"content":"\/emp\/delete_suc.jsp"}},{"attributes":{"name":"update","class":"updateBean","method":"update"},"content":"","result":{"attributes":[],"content":"\/emp\/edit_suc.jsp"}},{"attributes":{"name":"edit","class":"editBean","method":"edit"},"content":"","result":{"attributes":[],"content":"\/emp\/edit.jsp"}}]}}}
// 打印数组
function toArray()
{
    require_once '../classes/XmlToArray.php';
    $XML=<<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- struts2委托spring管理 -->
    <constant name="struts.objectFactory" value="spring"/>
    <!-- /crm/emp/add.action -->
    <package name="crm_employee" extends="struts-default" namespace="/emp">
        <action name="add" class="addBean" method="add">
            <result>add.action</result>
            <result>/emp/add_suc.jsp</result>
        </action>
        <action name="list" class="listBean" method="list">
            <result>/emp/list.jsp</result>
        </action>
        <action name="delete" class="deleteBean" method="delete">
            <result>delete.action</result>
            <result>/emp/delete_suc.jsp</result>
        </action>
        <action name="update" class="updateBean" method="update">
            <result>update.action</result>
            <result>/emp/edit_suc.jsp</result>
        </action>
        <action name="edit" class="editBean" method="edit">
            <result>/emp/edit.jsp</result>
        </action>
        <!-- Add actions here -->
    </package>
</struts>

XML;

    header("Content-type: text/html; charset=utf-8") ;
    $xml_to_array = new XmlToArray();
    $xml_to_array->setXml($XML);
    // 当标签名与内置属性有冲突的时候可以自定义相关属性名,一般其概况不需要设置
    //$xml_to_array->setAttributeAsName("attributeAsName")->setContentAsName("contentasName");
    $r = $xml_to_array->parseXml();
     print_r( $r ) ;
}
// 打印结果

Array
(
    [struts] => Array
        (
            [attributes] => Array
                (
                )

            [content] => 
            [constant] => Array
                (
                    [attributes] => Array
                        (
                            [name] => struts.objectFactory
                            [value] => spring
                        )

                    [content] => 
                )

            [package] => Array
                (
                    [attributes] => Array
                        (
                            [name] => crm_employee
                            [extends] => struts-default
                            [namespace] => /emp
                        )

                    [content] => 
                    [action] => Array
                        (
                            [0] => Array
                                (
                                    [attributes] => Array
                                        (
                                            [name] => add
                                            [class] => addBean
                                            [method] => add
                                        )

                                    [content] => 
                                    [result] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [attributes] => Array
                                                        (
                                                        )

                                                    [content] => add.action
                                                )

                                            [1] => Array
                                                (
                                                    [attributes] => Array
                                                        (
                                                        )

                                                    [content] => /emp/add_suc.jsp
                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [attributes] => Array
                                        (
                                            [name] => list
                                            [class] => listBean
                                            [method] => list
                                        )

                                    [content] => 
                                    [result] => Array
                                        (
                                            [attributes] => Array
                                                (
                                                )

                                            [content] => /emp/list.jsp
                                        )

                                )

                            [2] => Array
                                (
                                    [attributes] => Array
                                        (
                                            [name] => delete
                                            [class] => deleteBean
                                            [method] => delete
                                        )

                                    [content] => 
                                    [result] => Array
                                        (
                                            [attributes] => Array
                                                (
                                                )

                                            [content] => /emp/delete_suc.jsp
                                        )

                                )

                            [3] => Array
                                (
                                    [attributes] => Array
                                        (
                                            [name] => update
                                            [class] => updateBean
                                            [method] => update
                                        )

                                    [content] => 
                                    [result] => Array
                                        (
                                            [attributes] => Array
                                                (
                                                )

                                            [content] => /emp/edit_suc.jsp
                                        )

                                )

                            [4] => Array
                                (
                                    [attributes] => Array
                                        (
                                            [name] => edit
                                            [class] => editBean
                                            [method] => edit
                                        )

                                    [content] => 
                                    [result] => Array
                                        (
                                            [attributes] => Array
                                                (
                                                )

                                            [content] => /emp/edit.jsp
                                        )

                                )

                        )

                )

        )

)

2. [文件] XmlToArray.php ~ 3KB     下载(34)     跳至 [1] [2] [全屏预览]

<?php
/**
 * Created by JetBrains PhpStorm.
 * User: hedgehog
 * Date: 12-5-9
 * Time: 下午4:37
 * To change this template use File | Settings | File Templates.
 */
class XmlToArray
{
    private $xml;
    private $contentAsName="content" ;
    private $attributesAsName="attributes";
    private $xml_array = array();

    public function setXml( $xmlstr )
    {
        $this->xml = $xmlstr ;
        return $this ;
    }

    public function setContentAsName( $name )
    {
        $this->contentAsName = $name ;
        return $this ;
    }

    public function  setAttributeAsName( $name )
    {
        $this->attributesAsName = $name ;
        return $this ;
    }

    private function createXMLArray( $node,&$parent_node,$node_index =0)
    {
        $node_attrbutes= array() ;
        $node_name = $node->getName() ;
        $attributes = $node->attributes() ;
        $children  = $node->children () ;


    // 遍历节点上的所有属性
        foreach( $attributes as $attrname => $attrvalue )
        {
            $attrvalue  = ( string )$attrvalue ;
            $node_attrbutes[ $attrname ] = trim( $attrvalue ) ;
        }
        $content = "";
        if( count($children) == 0 )
        {
            $content =   ( string ) $node   ;
        }

        $node_array = array(
           $this->attributesAsName =>$node_attrbutes ,
           $this->contentAsName => trim( $content )
        );
//  设置层级关系
            if(  !isset( $parent_node[ $node_name ] )  )
            {
                $is = count( $parent_node ) ;
                if(  !isset( $parent_node[ $this->attributesAsName ] ) && count( $parent_node ) > 0 )
                {

                    $last_index = count( $parent_node ) -1 ;
                   $parent_node =& $parent_node[ $last_index ];
                   $parent_node[ $node_name ] = $node_array ;
                }
                else
                {
                    $parent_node[ $node_name ] = $node_array ;
                }
            }
            else
            {
                     $append  = &$parent_node[ $node_name ] ;
                   if( isset( $append[ $this->attributesAsName ] ) )
                   {
                       $parent_node[ $node_name ]  = array( $append );
                       $append  = &$parent_node[ $node_name ] ;

                   }
                   if( isset( $append[ $node_index ] ) )
                   {
                       $append =  &$append[ $node_index ] ;
                   }
                // 追加
                    array_push( $append ,  $node_array ) ;
            }

        $index = 0 ;
        // 递归操作
        foreach( $children as $childnode )
        {
            $parent =  &$parent_node[ $node_name  ] ;
            $this->createXMLArray( $childnode ,$parent,$index ++ );
        }
       return  $parent_node ;
    }

    public  function  parseXml( $isjson=false)
    {
        $root = simplexml_load_string ( $this->xml ) ;
        $parent_node = array();
        $array = $this->createXMLArray( $root ,$parent_node ) ;

        return $isjson ?  json_encode( $array ) : $array ;
    }
}
精彩图集

赞助商链接