91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php解析xml,并將xml轉換為層級數組

發布時間:2020-08-05 20:42:41 來源:網絡 閱讀:3564 作者:李生虎lsh 欄目:web開發

1)xml_parser_create([ string $encoding ] ):建立一個新的xml解析器并返回可被其他xml函數使用的資源句柄,

參數$encoding:

php4,中用來只指定要被解析的xml輸入的字符編碼方式;

php5,自動偵測輸入xml的編碼,encoding僅用來指定解析后輸出數據的編碼

默認:輸入編碼=輸出編碼

php5.0.2+默認編碼utf-8;之前版本,ISO-8859-1

2)bool xml_parser_set_option(resource $parser,int $option,mixed $value):為指定的的xml解析進行選項設置

parser:指向要設置選項信息的xml解析器指針

option:要設置選項的名稱

value:要設置選項的值

設置成功返回true,失敗返回false

選項數據類型描述

XML_OPTION_CASE_FOLDINGint 控制在該xml解析器中大小寫是否有效。默認有效,0原樣輸出,1轉換為大寫,只控制輸出樣式

XML_OPTION_SKIP_TAGSTARTint 指明在一個標記名前應略過幾個字符

XML_OPTION_SKIP_WHITEint 是否略過由空白字符組成的值

XML_OPTION_TARGET_ENCODINGstring

3)int xml_parse_into_struct(resource $parser,string $data,array &$values [,array &$index]):將xml

文件解析到兩個對應的數組中,index參數含有指向values數組中對應值的指針,該函數返回的是一級數組,不想dom樹那樣有層級關系

失敗返回0,成功返回1

4)eg:

源文件:

<?xml version="1.0" encoding="utf-8"?>

<newdata>

   <version a="xxx">aaaa</version>

   <sample><![CDATA[0]]></sample>

   <all><![CDATA[https]]></all>

</newdata>

value結果:

Array

(

   [0] => Array

       (

       //標簽名

           [tag] => newdata

           //節點狀態,open:含有子標簽,起始標簽;close:open的閉合部分;complete:無子標簽

           [type] => open

           //層級

           [level] => 1

       )


   [1] => Array

       (

           [tag] => version

           [type] => complete

           [level] => 2

           //節點屬性數組

           [attributes] => Array

               (

                   [a] => xxx

               )

           //節點值

           [value] => aaaa

       )


   [2] => Array

       (

           [tag] => sample

           [type] => complete

           [level] => 2

           [value] => 0

       )


   [3] => Array

       (

           [tag] => all

           [type] => complete

           [level] => 2

           [value] => https

       )


   [4] => Array

       (

           [tag] => newdata

           [type] => close

           [level] => 1

       )


)

索引結果:

Array

(

//節點名稱

   [newdata] => Array

       (

           [0] => 0//節點起始索引

           [1] => 4//節點結束索引

       )


   [version] => Array

       (

           [0] => 1

       )


   [sample] => Array

       (

           [0] => 2

       )


   [all] => Array

       (

           [0] => 3

       )


)

5)將xml轉換為array的函數:

    

    /**

     * 將xml字符串轉換為數組

     * @param string $contents

     * @param string $encoding

     * @param int $get_attrbutes

     * @param string $priority

     * @param array

     */

    public static function xml2Array($contents = NULL, $encoding = 'UTF-8', $get_attributes = 1, $priority = 'tag') {

        if(!$contents) {

            return array();

        }

        if(!function_exists('xml_parser_create')) {

            return array();

        }

        //xml解析器

        $parser = xml_parser_create('');

        xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,$encoding);

        //將標簽原樣輸出,不轉換成大寫

        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);

        //是否忽略空白字符

        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);

        //$xml_values,$index引用類型,將文本解析到指定的數組變量中

        xml_parse_into_struct($parser, trim($contents), $xml_values/*,$index*/);

        //釋放解析器

        xml_parser_free($parser);

        if(!$xml_values)

            return array();

        $xml_array = array();

        $parents = array();

        $opened_tags = array();

        $arr = array();

        //當前操作結構的指針

        $current = & $xml_array;

        //同級結構下重復標簽的計數

        $repeated_tag_index = array();

        foreach ($xml_values as $data) {

            //刪除屬性和值,確保每次用到的是新的

            unset($attributes, $value);

            //將標簽結構數組,釋放到當前的變量域中

            extract($data);

            //存當前標簽的結果

            $result = array();

            //存屬性

            $attributes_data = array();

            //標簽有value

            if(isset($value)) {

                if($priority == 'tag'){

                   $result = trim($value); 

                }else{

                    $result['value'] = trim($value);

                }

            }

            //標簽有屬性,且不忽略

            if($get_attributes && isset($attributes)) {

                foreach ($attributes as $attr => $val) {

                    if ($priority == 'tag'){//放入單獨記錄屬性的數組中

                        $attributes_data[$attr] = $val;

                    }else{//統一放入$result中

                        $result['attr'][$attr] = $val;

                    }

                }

            }

            //處理節點關系

            if ($type == "open") {//有子節點標簽

                $parent[$level - 1] = & $current; //$parent[$level - 1],指向復合標簽的起始處

                if (!is_array($current) || (!in_array($tag, array_keys($current)))) {//xml復合標簽的第一個

                    $current[$tag] = $result;//屬性獨立

                    /*處理結果

                        [tag] => Array

                        (

                            [value] => aaaa,

                            [attr] => Array

                                (

                                    [a] => xxx

                                )


                        )

                    */

                    if ($attributes_data){

                        $current[$tag . '_attr'] = $attributes_data;

                        /*處理結果

                            [tag] => xxxx,

                            [tag_attr] => Array

                                (

                                    [a] => xxx

                                )

                        */

                    }

                    $repeated_tag_index[$tag . '_' . $level] = 1;//記錄同級中該標簽重復的個數

                    //指針重新指向符合標簽的子標簽

                    $current = & $current[$tag];

                }else {

                    if (isset($current[$tag][0])) {//第3+個同級復合標簽

                        $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;

                        $repeated_tag_index[$tag . '_' . $level] ++;

                    } else {//第2個同級復合標簽

                        //在關聯數組外包一層索引數組

                        $current[$tag] = array(

                            $current[$tag],

                            $result

                        );

                        $repeated_tag_index[$tag . '_' . $level] = 2;

                        //此處只記錄第一個重復標簽的屬性,可能有bug,需注意!

                        //要想區別各子標簽的屬性,需要將$priority設成非'tag'

                        if (isset($current[$tag . '_attr'])) {

                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];

                            unset($current[$tag . '_attr']);

                        }

                    }

                    //記錄最后一個重復子標簽的索引

                    $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;

                    //指針指向下一個子標簽

                    $current = & $current[$tag][$last_item_index];

                }

            } elseif ($type == "complete") {

                //第一個complete類型的標簽

                if (!isset($current[$tag])) {

                    $current[$tag] = $result;

                    $repeated_tag_index[$tag . '_' . $level] = 1;

                    if ($priority == 'tag' && $attributes_data)

                        $current[$tag . '_attr'] = $attributes_data;

                }

                else {

                    //第3+個同級子標簽

                    //此處只有$current[$tag][0],不行,因為可能索引到字符串的第一個字符

                    if(isset($current[$tag][0]) && !is_array($current[$tag])){

                        print_r($current);exit();

                    }

                    if(isset($current[$tag][0]) && is_array($current[$tag])) {

                        $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;

                        //子標簽的屬性不忽略

                        if ($get_attributes &&  $priority == 'tag' && $attributes_data) {

                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;

                        }

                        $repeated_tag_index[$tag . '_' . $level] ++;

                    }else{//第2個同級子標簽

                        $current[$tag] = array(

                            $current[$tag],

                            $result

                        );

                        $repeated_tag_index[$tag . '_' . $level] = 1;

                        if ($priority == 'tag' && $get_attributes) {

                            if (isset($current[$tag . '_attr'])) {

                                $current[$tag]['0_attr'] = $current[$tag . '_attr'];

                                unset($current[$tag . '_attr']);

                            }

                            if ($attributes_data) {

                                $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;

                            }

                        }

                        $repeated_tag_index[$tag . '_' . $level] ++;

                    }

                }

            }elseif($type == 'close'){

                //閉合標簽和起始標簽level相同,因此進入complete類型的子標簽后,可以通過父節點的close標簽,可以指回到父節點

                $current = & $parent[$level - 1];

            }

        }

        return $xml_array;

    }

6)關于xml中的CDATA:

    在XML文檔中的所有文本都會被解析器解析。只有在CDATA部件之內的文本會被解析器忽略

    一個 CDATA 部件以"< ![CDATA[" 標記開始,以"]]>"標記結束:

    < script>
    < ![CDATA[
    function matchwo(a,b)
    {
        if (a < b && a < 0) then
        {
            return 1
        }
        else
        {
            return 0
        }
      }
     ]]>
    < /script>

    在前面的例子中,所有在CDATA部件之間的文本都會被解析器忽略。

    CDATA注意事項:
    CDATA部件之間不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]>" 或者"< !        [CDATA[" ,將很有可能出錯哦。

    同樣要注意在字符串"]]>"之間沒有空格或者換行符

參考地址:http://www.cnblogs.com/chenqingwei/archive/2010/04/21/1717237.html

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥中县| 贡嘎县| 慈利县| 祁阳县| 吉隆县| 玉环县| 星子县| 贺兰县| 广水市| 辉南县| 雅安市| 修水县| 离岛区| 土默特右旗| 章丘市| 兴文县| 怀来县| 大余县| 桂林市| 华亭县| 健康| 肃南| 澄迈县| 敦化市| 南雄市| 汝城县| 友谊县| 峨边| 华宁县| 洛川县| 宜州市| 天长市| 瑞安市| 策勒县| 聂荣县| 仙游县| 哈巴河县| 武隆县| 米泉市| 星子县| 靖西县|