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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 红帽linux中安装oracle数据库_红帽系统下载

    红帽linux中安装oracle数据库_红帽系统下载Linux下安装Oracle系统最好是1G内存,2G的swap空间,硬盘至少需要4.5G空间。至少环境在LinuxServerrelease5.3以上如果是LinuxServerrelease5.1,改装oracle10.2g吧一、查看Linux版本[root@localhost~]#cat/etc/issueRedHatEnterpriseLinuxServerrel…

    2022年9月21日
    1
  • C++STL容器总结[通俗易懂]

    持续更新中!!!各大容器的特点:1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map;特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的…

    2022年4月4日
    37
  • arping详解

    arping详解最近检测内网机器的ip占用问题,用到了arping,总结一下。版本arping主要干的活就是查看ip的MAC地址及IP占用的问题。arping有两个版本,一个版本是ThomasHabets这个人写的,这个版本有个好处是可以arping<MAC地址>,也就是说我们可以通过MAC地址得到IP。还有一个版本是Linuxiputilssui…

    2022年5月1日
    118
  • TCP连接异常终止(RST包)场景分析

    TCP连接异常终止(RST包)场景分析一、TCP异常终止(reset报文)TCP的异常终止是相对于正常释放TCP连接的过程而言的,我们都知道,TCP连接的建立是通过三次握手完成的,而TCP正常释放连接是通过四次挥手来完成。但是有些情况下,TCP在交互的过程中会出现一些意想不到的情况,导致TCP无法按照正常的三次握手建立连接或四次挥手来释放连接。如果此时不通过其他的方式来释放TCP连接的话,这个TCP连接将会一直存在,占用系统的资源。在这种情况下,我们就需要有一种能够释放TCP连接的机制,这种机制就是TCP的reset报文。reset报文是指

    2022年10月1日
    0
  • Ubuntu下很给力的下载工具

    Ubuntu下很给力的下载工具

    2021年12月9日
    51
  • java的System.getProperty()方法能够获取的值

    java的System.getProperty()方法能够获取的值

    2021年12月10日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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