***codeigniter操作xml(Simplexml第三方扩展)

***codeigniter操作xml(Simplexml第三方扩展)

This Simplexml class provides an alternative implementation of the SimpleXML API that works under PHP 4, so if you have an application that is running under PHP4 environment this is really helpful for you.

 

The original class was created by Taha Paksu of http://www.phpclasses.org and it was modified by Chris Brainard so that it would work with codeigniter.

 

Lets take a look at the code.

 

Php代码  
收藏代码

  1. <?php if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);  
  2.   
  3. class Simplexml{  
  4.   
  5.     var $result = array();  
  6.     var $ignore_level = 0;  
  7.     var $skip_empty_values = false;  
  8.     var $php_errormsg;  
  9.     var $evalCode=“”;  
  10.   
  11.         function xml_parse($data){  
  12.                 $php_errormsg=“”;  
  13.         $this->result=“”;  
  14.         $this->evalCode=“”;  
  15.         $values=“”;  
  16.                 $encoding = ‘UTF-8’;  
  17.         $parser = xml_parser_create($encoding);  
  18.         xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);  
  19.         xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);  
  20.         $ok = xml_parse_into_struct($parser, $data, $values);  
  21.         if (!$ok) {  
  22.             $errmsg = sprintf(“XML parse error %d ‘%s’ at line %d, column %d (byte index %d)”,  
  23.             xml_get_error_code($parser),  
  24.             xml_error_string(xml_get_error_code($parser)),  
  25.             xml_get_current_line_number($parser),  
  26.             xml_get_current_column_number($parser),  
  27.             xml_get_current_byte_index($parser));  
  28.         }  
  29.   
  30.         xml_parser_free($parser);  
  31.         return $this->xml_reorganize($values);  
  32.         }  
  33.   
  34.     function xml_reorganize($array)  
  35.     {  
  36.   
  37.         $count = count($array);  
  38.         $repeat = $this->xml_tags($array);  
  39.         $repeatedone = false;  
  40.         $tags = array();  
  41.         $k = 0;  
  42.         for ($i = 0; $i < $count; $i++) {  
  43.             switch ($array[$i][‘type’]) {  
  44.                 case ‘open’:  
  45.                     array_push($tags, $array[$i][‘tag’]);  
  46.                     if ($i > 0 && ($array[$i][‘tag’] == $array[$i-1][‘tag’]) && ($array[$i-1][‘type’] == ‘close’))  
  47.                     $k++;  
  48.                     if (isset($array[$i][‘value’]) && ($array[$i][‘value’] || !$this->skip_empty_values)) {  
  49.                         array_push($tags, ‘@content’);  
  50.                         $this->array_insert(count($tags), $tags, $array[$i][‘value’], “open”);  
  51.                         array_pop($tags);  
  52.                     }  
  53.   
  54.                     if (in_array($array[$i][‘tag’] . $array[$i][‘level’], $repeat)) {  
  55.                         if (($repeatedone == $array[$i][‘tag’] . $array[$i][‘level’]) && ($repeatedone)) {  
  56.                             array_push($tags, strval($k++));  
  57.                         } else {  
  58.                             $repeatedone = $array[$i][‘tag’] . $array[$i][‘level’];  
  59.                             array_push($tags, strval($k));  
  60.                         }  
  61.                     }  
  62.   
  63.                     if (isset($array[$i][‘attributes’]) && $array[$i][‘attributes’] && $array[$i][‘level’] != $this->ignore_level) {  
  64.                         array_push($tags, ‘@attributes’);  
  65.                         foreach ($array[$i][‘attributes’] as $attrkey => $attr) {  
  66.                             array_push($tags, $attrkey);  
  67.                             $this->array_insert(count($tags), $tags, $attr, “open”);  
  68.                             array_pop($tags);  
  69.                         }  
  70.                         array_pop($tags);  
  71.                     }  
  72.                     break;  
  73.   
  74.                 case ‘close’:  
  75.                     array_pop($tags);  
  76.                     if (in_array($array[$i][‘tag’] . $array[$i][‘level’], $repeat)) {  
  77.                         if ($repeatedone == $array[$i][‘tag’] . $array[$i][‘level’]) {  
  78.                             array_pop($tags);  
  79.                         } else {  
  80.                             $repeatedone = $array[$i + 1][‘tag’] . $array[$i + 1][‘level’];  
  81.                             array_pop($tags);  
  82.                         }  
  83.                     }  
  84.                     break;  
  85.   
  86.                 case ‘complete’:  
  87.                     array_push($tags, $array[$i][‘tag’]);  
  88.                     if (in_array($array[$i][‘tag’] . $array[$i][‘level’], $repeat)) {  
  89.                         if ($repeatedone == $array[$i][‘tag’] . $array[$i][‘level’] && $repeatedone) {  
  90.                             array_push($tags, strval($k));  
  91.                         } else {  
  92.                             $repeatedone = $array[$i][‘tag’] . $array[$i][‘level’];  
  93.                             array_push($tags, strval($k));  
  94.                         }  
  95.                     }  
  96.   
  97.                     if (isset($array[$i][‘value’]) && ($array[$i][‘value’] || !$this->skip_empty_values)) {  
  98.                         if (isset($array[$i][‘attributes’]) && $array[$i][‘attributes’]) {  
  99.                             array_push($tags, ‘@content’);  
  100.                             $this->array_insert(count($tags), $tags, $array[$i][‘value’], “complete”);  
  101.                             array_pop($tags);  
  102.                         } else {  
  103.                             $this->array_insert(count($tags), $tags, $array[$i][‘value’], “complete”);  
  104.                         }  
  105.                     }  
  106.   
  107.                     if (isset($array[$i][‘attributes’]) && $array[$i][‘attributes’]) {  
  108.                         array_push($tags, ‘@attributes’);  
  109.                         foreach ($array[$i][‘attributes’] as $attrkey => $attr) {  
  110.                             array_push($tags, $attrkey);  
  111.                             $this->array_insert(count($tags), $tags, $attr, “complete”);  
  112.                             array_pop($tags);  
  113.                         }  
  114.                         array_pop($tags);  
  115.                     }  
  116.   
  117.                     if (in_array($array[$i][‘tag’] . $array[$i][‘level’], $repeat)) {  
  118.                         array_pop($tags);  
  119.                         $k++;  
  120.                     }  
  121.   
  122.                     array_pop($tags);  
  123.                     break;  
  124.             }  
  125.         }  
  126.         eval($this->evalCode);  
  127.         $last = $this->array_reindex($this->result);  
  128.         return $last;  
  129.     }     
  130.   
  131.     function array_insert($level, $tags, $value, $type)  
  132.     {  
  133.         $temp = ”;  
  134.         for ($c = $this->ignore_level + 1; $c < $level + 1; $c++) {  
  135.             if (isset($tags[$c]) && (is_numeric(trim($tags[$c])) || trim($tags[$c]))) {  
  136.                 if (is_numeric($tags[$c])) {  
  137.                     $temp .= ‘[‘ . $tags[$c] . ‘]’;  
  138.                 } else {  
  139.                     $temp .= ‘[“‘ . $tags[$c] . ‘”]’;  
  140.                 }  
  141.             }  
  142.         }  
  143.         $this->evalCode .= ‘$this->result’ . $temp . “=\”” . addslashes($value) . “\”;//(” . $type . “)\n”;  
  144.         #echo $code. “\n”;  
  145.     }  
  146.   
  147.     /** 
  148.      * Define the repeated tags in XML file so we can set an index 
  149.      * 
  150.      * @param array $array 
  151.      * @return array 
  152.      */  
  153.     function xml_tags($array)  
  154.     {   $repeats_temp = array();  
  155.     $repeats_count = array();  
  156.     $repeats = array();  
  157.   
  158.     if (is_array($array)) {  
  159.         $n = count($array) – 1;  
  160.         for ($i = 0; $i < $n; $i++) {  
  161.             $idn = $array[$i][‘tag’].$array[$i][‘level’];  
  162.             if(in_array($idn,$repeats_temp)){  
  163.                 $repeats_count[array_search($idn,$repeats_temp)]+=1;  
  164.             }else{  
  165.                 array_push($repeats_temp,$idn);  
  166.                 $repeats_count[array_search($idn,$repeats_temp)]=1;  
  167.             }  
  168.         }  
  169.     }  
  170.     $n = count($repeats_count);  
  171.     for($i=0;$i<$n;$i++){  
  172.         if($repeats_count[$i]>1){  
  173.             array_push($repeats,$repeats_temp[$i]);  
  174.         }  
  175.     }  
  176.     unset($repeats_temp);  
  177.     unset($repeats_count);  
  178.     return array_unique($repeats);  
  179.     }  
  180.   
  181.     /** 
  182.      * Converts Array Variable to Object Variable 
  183.      * 
  184.      * @param array $arg_array 
  185.      * @return $tmp 
  186.      */  
  187.     function array2object ($arg_array)  
  188.     {  
  189.   
  190.         if (is_array($arg_array)) {  
  191.             $keys = array_keys($arg_array);  
  192.             if(!is_numeric($keys[0])) $tmp = new Xml;  
  193.             foreach ($keys as $key) {  
  194.                 if (is_numeric($key)) $has_number = true;  
  195.                 if (is_string($key)) $has_string = true;  
  196.             }  
  197.             if (isset($has_number) and !isset($has_string)) {  
  198.                 foreach ($arg_array as $key => $value) {  
  199.                     $tmp[] = $this->array2object($value);  
  200.                 }  
  201.             } elseif (isset($has_string)) {  
  202.                 foreach ($arg_array as $key => $value) {  
  203.                     if (is_string($key))  
  204.                     $tmp->$key = $this->array2object($value);  
  205.                 }  
  206.             }  
  207.         } elseif (is_object($arg_array)) {  
  208.             foreach ($arg_array as $key => $value) {  
  209.                 if (is_array($value) or is_object($value))  
  210.                 $tmp->$key = $this->array2object($value);  
  211.                 else  
  212.                 $tmp->$key = $value;  
  213.             }  
  214.         } else {  
  215.             $tmp = $arg_array;  
  216.         }  
  217.         return $tmp; //return the object  
  218.     }  
  219.   
  220.     /** 
  221.      * Reindexes the whole array with ascending numbers 
  222.      * 
  223.      * @param array $array 
  224.      * @return array 
  225.      */  
  226.     function array_reindex($array)  
  227.     {  
  228.         if (is_array($array)) {  
  229.             if(count($array) == 1 && $array[0]){  
  230.                 return $this->array_reindex($array[0]);  
  231.             }else{  
  232.                 foreach($array as $keys => $items) {  
  233.                     if (is_array($items)) {  
  234.                         if (is_numeric($keys)) {  
  235.                             $array[$keys] = $this->array_reindex($items);  
  236.                         } else {  
  237.                             $array[$keys] = $this->array_reindex(array_merge(array(), $items));  
  238.                         }  
  239.                     }  
  240.                 }  
  241.             }  
  242.         }  
  243.   
  244.         return $array;  
  245.     }  
  246.   
  247. }  

 

In this article we don’t need to understand what is in the code above. What is my aim is to show you how to use it.

 

Supposing you have an xml format like below, and you need it to present as a tabular data in an html page.

 

Xml代码  
收藏代码

  1. <?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>  
  2. <products xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>  
  3.   
  4.     <item>  
  5.         <id>1</id>  
  6.         <name>iPhone</name>  
  7.         <category>Mobile</category>  
  8.         <price>300</price>  
  9.     </item>  
  10.   
  11.     <item>  
  12.         <id>2</id>  
  13.         <name>iMac</name>  
  14.         <category>Desktop Computers</category>  
  15.         <price>2500</price>  
  16.     </item>  
  17.   
  18.     <item>  
  19.         <id>3</id>  
  20.         <name>MacBook Pro</name>  
  21.         <category>Mobile PC</category>  
  22.         <price>2000</price>  
  23.     </item>  
  24.   
  25.     <item>  
  26.         <id>4</id>  
  27.         <name>iTouch</name>  
  28.         <category>Gadgets</category>  
  29.         <price>150</price>  
  30.     </item>  
  31.   
  32.     <item>  
  33.         <id>5</id>  
  34.         <name>Wii</name>  
  35.         <category>Gaming</category>  
  36.         <price>1250</price>  
  37.     </item>  
  38.   
  39.     <item>  
  40.         <id>6</id>  
  41.         <name>Time Capsule</name>  
  42.         <category>Acessories</category>  
  43.         <price>1000</price>  
  44.     </item>  
  45.   
  46.     <item>  
  47.         <id>7</id>  
  48.         <name>Apple TV</name>  
  49.         <category>Gadgets</category>  
  50.         <price>800</price>  
  51.     </item>  
  52.   
  53. </products>  

 

Lets start by creating our controller, to make it easier lets make use of the default controller in fresh CI installation which is the welcome controller. Now open you welcome controller and in you index function populate the code below.

 

Php代码  
收藏代码

  1. function index()  
  2. {  
  3.     //load the parser library  
  4.     $this->load->library(‘parser’);  
  5.   
  6.               $data[‘title’] = ‘Parsing XML using Simplexml class of CodeIgniter’;  
  7.   
  8.               $data[‘products’] = $this->_getXML(‘myxml’);  
  9.   
  10.        $this->parser->parse(‘table_view’, $data);  
  11. }  

 

In this function we load the parser library, for those who dont know what a parser library is, its a simple templating engine of codeIgniter. Im using this almost always for me to get rid if the php tag in my view. Next we have a varialble title , and a variable products which calls the _getXML function with a string parametermyxml , we use this as reference of the filename for our XML file to be parse. Then load our table_view .

 

Lets add the _getXML function to our controller. Add this code in your welcome controller.

 

Php代码  
收藏代码

  1. function _getXML($fname)  
  2.   {  
  3.   
  4.               $filename = $fname.‘.xml’;  
  5.               $xmlfile=“./xml/”.$filename;  
  6.               $xmlRaw = file_get_contents($xmlfile);  
  7.   
  8.               $this->load->library(‘simplexml’);  
  9.               $xmlData = $this->simplexml->xml_parse($xmlRaw);  
  10.   
  11.               foreach($xmlData[‘item’] as $row)  
  12.               {  
  13.   
  14.     $result .= ‘<tr>’;  
  15.     $result .= ‘<td>’.$row[‘id’].‘</td>’;  
  16.     $result .= ‘<td>’.$row[‘name’].‘</td>’;  
  17.     $result .= ‘<td>’.$row[‘category’].‘</td>’;  
  18.     $result .= ‘<td>$ ‘.$row[‘price’].‘</td>’;  
  19.     $result .= ‘</tr>’;  
  20.   
  21.               }  
  22.                return $result;  
  23.       }  

 

This assume that the file location of your xml file is in the root of your CI installation an inside the xml folder. Then using the file_get_contents() function we load the xml data to $xmlRaw varialble. We loaded the simple XML library and then we populate it to the table element using foreach() function.

Now you only need to add a very little code in your view file.

 

Html代码  
收藏代码

  1. <table cellpadding=“0” cellspacing=“0”>  
  2.     <thead>  
  3.     <th>  
  4.             <td>PRODUCT ID</td>  
  5.             <td>PRODUCT NAME</td>  
  6.             <td>CATEGORY</td>  
  7.             <td>PRICE</td>  
  8.     </th>  
  9.     </thead>  
  10.   
  11.     <tbody>  
  12.         {products}  
  13.     </tbody>  
  14.   
  15. </table>  

 

Thats it!. Adding some quick css styling and a jQuery for table row stripe effect. You get something like this.

 

***codeigniter操作xml(Simplexml第三方扩展)

 

Adding a quick table stripe effect.

Download and include the jQuery library file in your view.

 

Js代码  
收藏代码

  1. <script type=“text/javascript” src=“public/js/jquery.js”></script>  

 

Then add this line before the tag in your view file.

 

Php代码  
收藏代码

  1. <script type=“text/javascript”>  
  2.     $(document).ready(function(){  
  3.   
  4.         $(“table tr:nth-child(even)”).addClass(“even”);  
  5.   
  6.     });  
  7. </script>  

 

And you must have a style like this in your css file.

 

Html代码  
收藏代码

  1. table tr.even td{  
  2.     background: #cdded6;  
  3. }  

 

Were done. Thanks for reading.

————————————————————–链接:

http://justcoding.iteye.com/blog/558775

http://blog.insicdesigns.com/2009/03/parsing-xml-file-using-codeigniters-simplexml-library/

BUG修改:

Q:

nice work and really working fine please can you update this library because i have seen in comments 
if(count($array) == 1 && isset($array[0]))

please upate it.

A:

change this line if(count($array) == 1 && $array[0]){

to below line..this line exist in library function is “array_reindex” (line no 230)

if(count($array) == 1 && array_key_exists(0, $array)){

 

转载于:https://www.cnblogs.com/kenshinobiy/p/4358648.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109512.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 冯·诺依曼计算机特点[通俗易懂]

    冯·诺依曼计算机特点冯·诺依曼,20世纪最重要的数学家之一。在现代计算机、博弈论、核武器和生化武器等众多领域内有杰出建树的最伟大的科学全才之一,被后人称为“计算机之父”和“博弈论之父”。一、冯·诺依曼计算机结构二、冯·诺依曼计算机的特点计算机由五大部件组成:存储器,运算器,控制器,输入设备,输出设备。指令和数据以同等地位存于存储器,可按地址顺序访问。指令和数据用二进制表示。指令由操作码和地址码组成。存储程序,程序在计算机中顺序存放。以运算器为中心。(不合理:花大量的时间进行数据传输,降

  • mysql如何做到读写分离_MySQL读写分离如何实现?

    主要说下读写分离,当我们的数据量很大时,数据库服务器的压力变大,这时候我们需要从架构方面来解决这一问题,在一个网站中读的操作很多,写的操作很少,这时候我们需要配置读写分离,把读操作和写操作分离出来,最大程度的利用好数据库服务器。读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台…

  • code blocks使用方法总结「建议收藏」

    code blocks使用方法总结「建议收藏」下载和安装:官网地址:http://www.codeblocks.org/downloadstips:同一个版本有多个安装文件,官网上有对于各个文件的简要介绍。最好选择 mingw-se

  • bootstrap开发工具_bootstrap经典网页布局

    bootstrap开发工具_bootstrap经典网页布局在这里推荐一款基于bootstrap的在线布局工具,以后布局可以就可以和做PPT一样了http://www.bootcss.com/p/layoutit/

  • python连接数据库插入数据「建议收藏」

    python连接数据库插入数据「建议收藏」python连接数据库插入数据在数据库创建表并插入测试数据dropdatabaseifexistshrs;createdatabasehrsdefaultcharsetutf8mb4;usehrs;createtabletb_dept(dnointnotnullcomment’编号’,dnamevarchar(10)notnullcomment’名称’,dlocvarchar(20)notnullcomment’所在地’,prim

    2022年10月27日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号