***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...

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.

 

 

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)){

 

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
1月前
|
XML C# 数据格式
使用C#操作XML文件
使用C#操作XML文件
11 0
|
4月前
|
XML Java 开发工具
jdom操作xml实战
jdom操作xml实战
|
7月前
|
XML JavaScript 安全
XML( 可扩展编辑语言 ) —— DOM解析
XML( 可扩展编辑语言 ) —— DOM解析
52 2
|
1月前
|
XML 存储 JavaScript
深入学习 XML 解析器及 DOM 操作技术
所有主要的浏览器都内置了一个XML解析器,用于访问和操作XML XML 解析器 在访问XML文档之前,必须将其加载到XML DOM对象中 所有现代浏览器都有一个内置的XML解析器,可以将文本转换为XML DOM对象
72 0
|
3月前
|
XML Java 数据库连接
Mybatis之简介、使用操作(安装、XML、SqlSession、映射的SQL语句、命名空间、作用域和生命周期)
【1月更文挑战第2天】 MyBatis 是一款优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
106 2
Mybatis之简介、使用操作(安装、XML、SqlSession、映射的SQL语句、命名空间、作用域和生命周期)
|
8月前
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
41 0
|
4月前
|
XML Java 数据库连接
* 完成单表操作:需要3个功能。 * 功能1:使用注解 * 功能2:通用Mapper * 功能3:使用xml
* 完成单表操作:需要3个功能。 * 功能1:使用注解 * 功能2:通用Mapper * 功能3:使用xml
94 0
|
6月前
|
XML 存储 JSON
【100天精通python】Day29:文件与IO操作_XML文件处理
【100天精通python】Day29:文件与IO操作_XML文件处理
51 0
|
7月前
|
XML 存储 设计模式
XML(可扩展编辑语言) —— DTD
XML(可扩展编辑语言) —— DTD
36 2
|
8月前
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作2
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作2
50 0