`
天梯梦
  • 浏览: 13730222 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

codeigniter操作xml

阅读更多

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 if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Simplexml{

	var $result = array();
	var $ignore_level = 0;
	var $skip_empty_values = false;
	var $php_errormsg;
	var $evalCode="";

        function xml_parse($data){
                $php_errormsg="";
		$this->result="";
		$this->evalCode="";
		$values="";
            	$encoding = 'UTF-8';
		$parser = xml_parser_create($encoding);
		xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
		xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
		$ok = xml_parse_into_struct($parser, $data, $values);
		if (!$ok) {
			$errmsg = sprintf("XML parse error %d '%s' at line %d, column %d (byte index %d)",
			xml_get_error_code($parser),
			xml_error_string(xml_get_error_code($parser)),
			xml_get_current_line_number($parser),
			xml_get_current_column_number($parser),
			xml_get_current_byte_index($parser));
		}

		xml_parser_free($parser);
		return $this->xml_reorganize($values);
        }

	function xml_reorganize($array)
	{

		$count = count($array);
		$repeat = $this->xml_tags($array);
		$repeatedone = false;
		$tags = array();
		$k = 0;
		for ($i = 0; $i < $count; $i++) {
			switch ($array[$i]['type']) {
				case 'open':
					array_push($tags, $array[$i]['tag']);
					if ($i > 0 && ($array[$i]['tag'] == $array[$i-1]['tag']) && ($array[$i-1]['type'] == 'close'))
					$k++;
					if (isset($array[$i]['value']) && ($array[$i]['value'] || !$this->skip_empty_values)) {
						array_push($tags, '@content');
						$this->array_insert(count($tags), $tags, $array[$i]['value'], "open");
						array_pop($tags);
					}

					if (in_array($array[$i]['tag'] . $array[$i]['level'], $repeat)) {
						if (($repeatedone == $array[$i]['tag'] . $array[$i]['level']) && ($repeatedone)) {
							array_push($tags, strval($k++));
						} else {
							$repeatedone = $array[$i]['tag'] . $array[$i]['level'];
							array_push($tags, strval($k));
						}
					}

					if (isset($array[$i]['attributes']) && $array[$i]['attributes'] && $array[$i]['level'] != $this->ignore_level) {
						array_push($tags, '@attributes');
						foreach ($array[$i]['attributes'] as $attrkey => $attr) {
							array_push($tags, $attrkey);
							$this->array_insert(count($tags), $tags, $attr, "open");
							array_pop($tags);
						}
						array_pop($tags);
					}
					break;

				case 'close':
					array_pop($tags);
					if (in_array($array[$i]['tag'] . $array[$i]['level'], $repeat)) {
						if ($repeatedone == $array[$i]['tag'] . $array[$i]['level']) {
							array_pop($tags);
						} else {
							$repeatedone = $array[$i + 1]['tag'] . $array[$i + 1]['level'];
							array_pop($tags);
						}
					}
					break;

				case 'complete':
					array_push($tags, $array[$i]['tag']);
					if (in_array($array[$i]['tag'] . $array[$i]['level'], $repeat)) {
						if ($repeatedone == $array[$i]['tag'] . $array[$i]['level'] && $repeatedone) {
							array_push($tags, strval($k));
						} else {
							$repeatedone = $array[$i]['tag'] . $array[$i]['level'];
							array_push($tags, strval($k));
						}
					}

					if (isset($array[$i]['value']) && ($array[$i]['value'] || !$this->skip_empty_values)) {
						if (isset($array[$i]['attributes']) && $array[$i]['attributes']) {
							array_push($tags, '@content');
							$this->array_insert(count($tags), $tags, $array[$i]['value'], "complete");
							array_pop($tags);
						} else {
							$this->array_insert(count($tags), $tags, $array[$i]['value'], "complete");
						}
					}

					if (isset($array[$i]['attributes']) && $array[$i]['attributes']) {
						array_push($tags, '@attributes');
						foreach ($array[$i]['attributes'] as $attrkey => $attr) {
							array_push($tags, $attrkey);
							$this->array_insert(count($tags), $tags, $attr, "complete");
							array_pop($tags);
						}
						array_pop($tags);
					}

					if (in_array($array[$i]['tag'] . $array[$i]['level'], $repeat)) {
						array_pop($tags);
						$k++;
					}

					array_pop($tags);
					break;
			}
		}
		eval($this->evalCode);
		$last = $this->array_reindex($this->result);
		return $last;
	}	

	function array_insert($level, $tags, $value, $type)
	{
		$temp = '';
		for ($c = $this->ignore_level + 1; $c < $level + 1; $c++) {
			if (isset($tags[$c]) && (is_numeric(trim($tags[$c])) || trim($tags[$c]))) {
				if (is_numeric($tags[$c])) {
					$temp .= '[' . $tags[$c] . ']';
				} else {
					$temp .= '["' . $tags[$c] . '"]';
				}
			}
		}
		$this->evalCode .= '$this->result' . $temp . "=\"" . addslashes($value) . "\";//(" . $type . ")\n";
		#echo $code. "\n";
	}

	/**
	 * Define the repeated tags in XML file so we can set an index
	 *
	 * @param array $array
	 * @return array
	 */
	function xml_tags($array)
	{	$repeats_temp = array();
	$repeats_count = array();
	$repeats = array();

	if (is_array($array)) {
		$n = count($array) - 1;
		for ($i = 0; $i < $n; $i++) {
			$idn = $array[$i]['tag'].$array[$i]['level'];
			if(in_array($idn,$repeats_temp)){
				$repeats_count[array_search($idn,$repeats_temp)]+=1;
			}else{
				array_push($repeats_temp,$idn);
				$repeats_count[array_search($idn,$repeats_temp)]=1;
			}
		}
	}
	$n = count($repeats_count);
	for($i=0;$i<$n;$i++){
		if($repeats_count[$i]>1){
			array_push($repeats,$repeats_temp[$i]);
		}
	}
	unset($repeats_temp);
	unset($repeats_count);
	return array_unique($repeats);
	}

	/**
	 * Converts Array Variable to Object Variable
	 *
	 * @param array $arg_array
	 * @return $tmp
	 */
	function array2object ($arg_array)
	{

		if (is_array($arg_array)) {
			$keys = array_keys($arg_array);
			if(!is_numeric($keys[0])) $tmp = new Xml;
			foreach ($keys as $key) {
				if (is_numeric($key)) $has_number = true;
				if (is_string($key)) $has_string = true;
			}
			if (isset($has_number) and !isset($has_string)) {
				foreach ($arg_array as $key => $value) {
					$tmp[] = $this->array2object($value);
				}
			} elseif (isset($has_string)) {
				foreach ($arg_array as $key => $value) {
					if (is_string($key))
					$tmp->$key = $this->array2object($value);
				}
			}
		} elseif (is_object($arg_array)) {
			foreach ($arg_array as $key => $value) {
				if (is_array($value) or is_object($value))
				$tmp->$key = $this->array2object($value);
				else
				$tmp->$key = $value;
			}
		} else {
			$tmp = $arg_array;
		}
		return $tmp; //return the object
	}

	/**
	 * Reindexes the whole array with ascending numbers
	 *
	 * @param array $array
	 * @return array
	 */
	function array_reindex($array)
	{
		if (is_array($array)) {
			if(count($array) == 1 && $array[0]){
				return $this->array_reindex($array[0]);
			}else{
				foreach($array as $keys => $items) {
					if (is_array($items)) {
						if (is_numeric($keys)) {
							$array[$keys] = $this->array_reindex($items);
						} else {
							$array[$keys] = $this->array_reindex(array_merge(array(), $items));
						}
					}
				}
			}
		}

		return $array;
	}

}
 

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 version="1.0" encoding="UTF-8" standalone="yes"?>
<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<item>
		<id>1</id>
		<name>iPhone</name>
		<category>Mobile</category>
		<price>300</price>
	</item>

	<item>
		<id>2</id>
		<name>iMac</name>
		<category>Desktop Computers</category>
		<price>2500</price>
	</item>

	<item>
		<id>3</id>
		<name>MacBook Pro</name>
		<category>Mobile PC</category>
		<price>2000</price>
	</item>

	<item>
		<id>4</id>
		<name>iTouch</name>
		<category>Gadgets</category>
		<price>150</price>
	</item>

	<item>
		<id>5</id>
		<name>Wii</name>
		<category>Gaming</category>
		<price>1250</price>
	</item>

	<item>
		<id>6</id>
		<name>Time Capsule</name>
		<category>Acessories</category>
		<price>1000</price>
	</item>

	<item>
		<id>7</id>
		<name>Apple TV</name>
		<category>Gadgets</category>
		<price>800</price>
	</item>

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

 

	function index()
	{
		//load the parser library
		$this->load->library('parser');

               $data['title'] = 'Parsing XML using Simplexml class of CodeIgniter';

               $data['products'] = $this->_getXML('myxml');

	       $this->parser->parse('table_view', $data);
	}

 

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 parameter myxml , 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.

 

  function _getXML($fname)
    {

                $filename = $fname.'.xml';
                $xmlfile="./xml/".$filename;
                $xmlRaw = file_get_contents($xmlfile);

                $this->load->library('simplexml');
                $xmlData = $this->simplexml->xml_parse($xmlRaw);

                foreach($xmlData['item'] as $row)
                {

			$result .= '<tr>';
			$result .= '<td>'.$row['id'].'</td>';
			$result .= '<td>'.$row['name'].'</td>';
			$result .= '<td>'.$row['category'].'</td>';
			$result .= '<td>$ '.$row['price'].'</td>';
			$result .= '</tr>';

                }
                 return $result;
        }
 

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.

 

<table cellpadding="0" cellspacing="0">
	<thead>
	<th>
			<td>PRODUCT ID</td>
			<td>PRODUCT NAME</td>
			<td>CATEGORY</td>
			<td>PRICE</td>
	</th>
	</thead>

	<tbody>
		{products}
	</tbody>

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

 

<script type="text/javascript" src="public/js/jquery.js"></script>

 

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

 

<script type="text/javascript">
	$(document).ready(function(){

		$("table tr:nth-child(even)").addClass("even");

	});
</script>
 

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

 

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

Were done. Thanks for reading.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    codeigniter 操作 Rss

    在“CodeIgniter操作Rss”这个主题中,我们将深入探讨如何在CodeIgniter框架中处理RSS(Really Simple Syndication) feeds,这是一种广泛使用的格式,用于发布和订阅新闻、博客文章和其他定期更新的内容。...

    CodeIgniter 1.72 中文帮助文档

    库是CodeIgniter中的核心组件,如数据库连接、邮件发送、XML-RPC等。它们扩展了框架的功能,允许开发者访问更高级的操作。 9. **配置(Configuration)** CodeIgniter允许开发者通过配置文件来定制框架的行为,如...

    CodeIgniter集成SOAP功能

    5. **创建WSDL文件**:WSDL文件是SOAP服务的重要组成部分,它定义了服务的接口、操作和数据类型。可以手动创建,或者使用工具自动生成。在CodeIgniter中,你可能需要使用第三方库如wsdl2phpgenerator来生成PHP代码,...

    PHP敏捷开发CodeIgniter框架

    CodeIgniter的类库如FTP、Email和XML-RPC,方便开发者实现与外部服务的通信。 8. **测试与性能分析**:CodeIgniter提供了单元测试、基准测试和分析器,帮助开发者确保代码质量,同时找出性能瓶颈。 9. **辅助函数*...

    codeigniter使用例程 网站跳转管理系统

    通过学习这个CodeIgniter的使用例程,你可以深入了解如何使用这个框架来构建一个简单的网站跳转管理系统,并从中学习到如何整合MVC模式、数据库操作、AJAX交互以及CodeIgniter的其他核心特性。实践这样的项目有助于...

    jqgrid_codeigniter_library

    它通过AJAX技术动态加载数据,使得用户可以在不刷新页面的情况下操作数据。 2. **配置选项**:`jqGrid`有许多可配置的选项,例如表格列的定义、数据来源、分页设置、排序规则等。这些选项可以通过JavaScript代码来...

    Codeigniter通过SimpleXML将xml转换成对象的方法

    你可以像下面这样访问和操作XML数据: ```php $xml_content = '&lt;books&gt;...&lt;/books&gt;'; // 假设这是你的XML字符串 $manipulateXML = new CI_ManipulateXML($xml_content); $xmlobject = $manipulateXML-&gt;ConvertXML()...

    CodeIgniter and Ajax using jQuery.zip

    CodeIgniter使用Active Record模式来处理数据库操作,使得编写SQL查询更加简洁和安全。 4. `assets`:通常存放Web应用的静态资源,如CSS样式表、JavaScript文件、图片等。在本案例中,jQuery库可能位于此目录下的JS...

    无涯教程(LearnFk)-Codeigniter教程离线版.pdf

    CodeIgniter的安装过程非常简单,只需要按照以下步骤操作: 1. 从官方网站下载最新版本的CodeIgniter。 2. 解压缩下载的文件夹。 3. 将所有文件和文件夹上传到服务器。 4. 通过浏览器访问服务器的URL(例如***)...

    ecommerce-codeigniter:PHP,CSS,JavaScript,MySQL,引导程序,CodeIgniter

    在CodeIgniter中,可以使用其内置的数据库类与MySQL进行交互,执行CRUD(创建、读取、更新、删除)操作。 在“ecommerce-codeigniter-main”这个压缩包中,我们预期会找到该项目的所有源代码文件,包括控制器、模型...

    辛星 JDBC、MyBatis、Spring、Yaf、LESS、Symfony、Markdown、SQLite、Codeigniter 教程 2016

    Codeigniter教程将介绍其核心架构、数据库操作、安全实践以及错误处理。 这些教程对于希望全面了解和掌握这些技术的开发者来说是宝贵的资源。通过学习,你可以提升自己的技能,更好地适应和解决实际项目中的问题。...

    CodeIgniter-

    CodeIgniter可以通过扩展或第三方库轻松实现RESTful API的开发,支持JSON、XML等多种数据格式,便于构建面向服务的架构。 总的来说,CodeIgniter是一个功能齐全且易于学习的PHP框架,通过理解和掌握上述知识点,...

    Blog-Codeigniter:criando um blog com codeigniter

    实施SEO最佳实践,如设置元标签、URL重写、生成XML站点地图等,以提高搜索引擎的可见性。 **15. 测试和部署** 进行全面的功能测试,确保所有功能正常运行。然后将项目上传到生产服务器,配置好服务器环境,如...

    网上药房商店Codeigniter

    "网上药房商店Codeigniter"项目显然利用了这个框架来开发一个在线药店平台,允许用户购买药品、查询药品信息以及进行订单管理等操作。 在深入探讨这个项目之前,我们首先了解一下CodeIgniter的关键特性: 1. **MVC...

    CodeIgniter-Shop

    4. **数据库操作**:CodeIgniter的Active Record库提供了方便的数据库操作,如查询构造、插入、更新和删除记录,支持多种数据库系统。 5. **安全与防护**:包括输入验证、XSS过滤、防止SQL注入等,保障应用的安全性...

    absensi-CodeIgniter

    在CodeIgniter中实现RESTful服务,可以提高系统的可扩展性和互操作性,便于移动端或第三方服务与之交互。 【标签】"HTML"表明此项目可能涉及到前端页面的开发,HTML(HyperText Markup Language)是用于创建网页的...

    CI(CodeIgniter)框架视图中加载视图的方法

    最后,CodeIgniter框架还拥有许多其他优秀的特性,比如路由系统的配置、数据库操作、安全性控制等,这些都需要开发者在实践中不断学习和掌握。为了深入理解CodeIgniter框架的更多内容,读者可以查阅相关的教程和文档...

    propinsi-codeigniter:用ajax技术显示区域数据

    在“propinsi-codeigniter”项目中,我们看到的是如何利用AJAX和jQuery技术来动态地展示印度尼西亚的区域数据,包括省份、区、街道和村庄的信息。这个例子展示了Web开发中的前后端交互,使得用户无需刷新页面就能...

Global site tag (gtag.js) - Google Analytics