***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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • “大数据管理局”让大数据共用共享

    “大数据管理局”让大数据共用共享近日,广州市政府官方网站公布了工信委、商务委和国资委3个部门的“三定方案”。三个部门共“定编”339名,其中商务委编制最多,占比超4成。机构设置方面,工信委下设的广州市大数据管理局(正处级)颇具创新,其承载着建设工业大数据库等9项重要职责。城市发展到了今天这么大的体量,社会治理模式也需要不断升级。大数据,无疑是一个重要的发展方向。随着网络的普及…

    2022年6月8日
    48
  • Win8 app判断网络连接状态

    Win8app判断网络连接状态推荐:http://www.cnblogs.com/roucheng/p/3535198.html

    2021年12月25日
    48
  • onedrive申请1T免费空间_drive百度云

    onedrive申请1T免费空间_drive百度云微软推出学生活动。教育网邮箱账户可以免费领取onedrive1T容量,免费获取OFFICE365帐号。首先我们要到https://xkx.me/领取一个可以获得福利的临时邮箱。(最好输入一个ID/前缀)提示:通常你能在5分钟内收到邮件。然后打开https://www.microsoft.com/en-us/education/products/office?tab=students这时注意了,一定要等这个网站完全加载完再输入邮箱!!!!!也就是不能让网站处于下图的一种.

    2025年9月7日
    6
  • 图片爬虫

    图片爬虫参考视频学习,堆糖网图片爬虫"""1.URL2.模拟浏览器请求资源3.解析网页4.保存数据到本地"""importrequests#第三方库importurllib.parseimportjsonimportjsonpathurl=’https://www.duitang.com/napi/blog/list/by_search/?kw={}&amp;s…

    2022年6月17日
    31
  • hrbust1224「建议收藏」

    hrbust1224「建议收藏」1.图形输出2.每一个图形的输出都有自己的规律3.不一定要自己一个个printf加for的一行行输出这样会有错4.好比是hrbust1224;这里写代码片include

    2022年5月4日
    46
  • loadrunner12安装教程_word入门基础教程视频

    loadrunner12安装教程_word入门基础教程视频Loadrunner安装_简单使用基础教程,包括VirtualUserGenerator、Controller、Analysis的简单使用以及对Loadrunner的介绍。

    2022年10月14日
    6

发表回复

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

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