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

相关推荐

  • 打开python 报R6034 错误

    打开python 报R6034 错误我只在Python3和python2同时在anaconda3下安装出现的问题,后来移除python2也不起作用,找到了这个方法,解决的问题。6034指的是:”AnapplicationhasmadeanattempttoloadtheCruntimelibraryincorrectly.Pleasecontacttheapplication’ssuppor…

    2022年10月24日
  • 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(二)——自定义安装

    使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(二)——自定义安装自定义产品卸载方式        继续从上一次的基础上前进,现在我们已经知道了最简单的bootstrapper打包方法,现在我们对其中的每个节点深入自定义,争取可以达到我们需要的效果。先把最后全部的XML贴出来。

    2022年7月20日
  • quartus ii15.1安装教程_quartus ii9.1安装教程

    quartus ii15.1安装教程_quartus ii9.1安装教程安装步骤:安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,存放安装包的路径最好也不要有中文。1.解压安装包。2.安装前下载相应的器件库文件。再安装包–>器件库下载地址–>器件库下载地址.txt。复制器件库中需要的器件的下载地址。3.下载好库文件后将它放在软件安装程序同一路径。运行安装程序。4.点击NEXT。5.点击Iaccept,然后点击NEXT。…

    2022年10月15日
  • 解决gradle下载慢的问题

    解决gradle下载慢的问题开发工具:IntelliJIDEA&AndroidStudio问题:新建项目下载gradle慢的问题解决:打开用户主目录linux平台/home/用户名/.gradlewindows平台c:\Users\用户名\.gradlemacos平台/Users/用户名/.gradle找到./gradle/wrapper/dist/gradle-版本号-bin目

  • igmp协议分析_协议分析

    igmp协议分析_协议分析IGMP协议。通过抓包详细分析了IGMP成员报告报文和IGMP离组报文。类型1字节最大响应时间1字节检验和2字节多播地址4字节类型11成员查询12成员报告(v1)16成员报告(v2)22成员报告(v3)17成员退出IGMP协议分析…

  • Java高级面试题!69个经典Java面试题和答案详解

    Java高级面试题!69个经典Java面试题和答案详解拼多多一面首先自我介绍参加过哪些项目并发编程三要素?实现可见性的方法有哪些?多线程的价值?创建线程的三种方式的对比?画出线程的状态流转图常用的并发工具类有哪些?CyclicBarrier和CountDownLatch的区别CAS的问题:1、CAS容易造成ABA问题2、不能保证代码块的原子性3、CAS造成CPU利用率增加ReadWriteLock是什么一面面试题答案:拼多多二面自我介绍什么是工厂模式?如何实现单链表的增删操作?让我说意思JVM的分为哪几块

发表回复

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

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