PHP中XML操作类XML Library的实现

本文实例讲述了PHP实现的XML操作类。分享给大家供大家参考,具体如下:

这是一个接口程序,需要大量分析解析XML,PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组,而SimpleXML扩展在PHP5中才支持,于是逛逛搜索引擎,在老外的网站上找到了一个不错的PHP XML操作类。

一、用法举例:

1、将XML文件解释成便于使用的数组:

<?php

include('xml.php');//引用PHP XML操作类

$xml=file_get_contents('data.xml');//读取XML文件

//$xml = file_get_contents("php://input"); //读取POST过来的输入流

$data=XML_unserialize($xml);

echo'<pre>';

print_r($data);

echo'</pre>';

?>

data.xml文件:

<?xmlversion="1.0"encoding="GBK"?>

<video>

<upload>

<videoid>998</videoid>

<name><![CDATA[回忆未来]]></name>

<memo><![CDATA[def]]></memo>

<up_userid>11317</up_userid>

</upload>

</video>

利用该XML操作类生成的对应数组(汉字编码:UTF-8):

Array

(

 [video] => Array

  (

   [upload] => Array

    (

     [videoid] => 998

     [name] => 回忆未来

     [memo] => def

     [up_userid] => 11317

    )

  )

)

2、将数组转换成XML文件:

<?php

include('xml.php');//引用PHP XML操作类

$xml= XML_serialize($data);

?>

二、PHP XML操作类源代码:

<?php

###################################################################################

# XML_unserialize: takes raw XMLasa parameter (a string)

#andreturns an equivalent PHP data structure

###################################################################################

function& XML_unserialize(&$xml){

 $xml_parser= &newXML();

 $data= &$xml_parser->parse($xml);

 $xml_parser->destruct();

 return$data;

}

###################################################################################

# XML_serialize: serializes any PHP data structure into XML

# Takes one parameter: the data to serialize. Must be anarray.

###################################################################################

function& XML_serialize(&$data,$level= 0,$prior_key= NULL){

 if($level== 0){ ob_start();echo'<?xml version="1.0" ?>',"\n"; }

 while(list($key,$value) = each($data))

  if(!strpos($key,' attr')) #ifit's not an attribute

   #we don't treat attributes by themselves, soforan emptyempty element

   # that has attributes you still need to set the element to NULL

   if(is_array($value)andarray_key_exists(0,$value)){

    XML_serialize($value,$level,$key);

   }else{

    $tag=$prior_key?$prior_key:$key;

    echostr_repeat("\t",$level),'<',$tag;

    if(array_key_exists("$key attr",$data)){ #ifthere's an attributeforthis element

     while(list($attr_name,$attr_value) = each($data["$key attr"]))

      echo' ',$attr_name,'="',htmlspecialchars($attr_value),'"';

     reset($data["$key attr"]);

    }

    if(is_null($value))echo" />\n";

    elseif(!is_array($value))echo'>',htmlspecialchars($value),"</$tag>\n";

    elseecho">\n",XML_serialize($value,$level+1),str_repeat("\t",$level),"</$tag>\n";

   }

 reset($data);

 if($level== 0){$str= &ob_get_contents(); ob_end_clean();return$str; }

}

###################################################################################

# XMLclass: utilityclassto be used with PHP's XML handling functions

###################################################################################

classXML{

 var$parser; #a reference to the XML parser

 var$document; #the entire XML structure built up so far

 var$parent; #a pointer to the current parent - the parent will be anarray

 var$stack; #a stack of the most recent parent at each nesting level

 var$last_opened_tag; #keeps track of the last tag opened.

 functionXML(){

   $this->parser = &xml_parser_create();

  xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);

  xml_set_object(&$this->parser, &$this);

  xml_set_element_handler(&$this->parser,'open','close');

  xml_set_character_data_handler(&$this->parser,'data');

 }

 functiondestruct(){ xml_parser_free(&$this->parser); }

 function& parse(&$data){

  $this->document =array();

  $this->stack =array();

  $this->parent = &$this->document;

  returnxml_parse(&$this->parser, &$data, true) ?$this->document : NULL;

 }

 functionopen(&$parser,$tag,$attributes){

  $this->data =''; #stores temporary cdata

  $this->last_opened_tag =$tag;

  if(is_array($this->parent)andarray_key_exists($tag,$this->parent)){ #ifyou've seen this tag before

   if(is_array($this->parent[$tag])andarray_key_exists(0,$this->parent[$tag])){ #ifthe keys are numeric

    #this is the thirdorlater instance of$tagwe've come across

    $key= count_numeric_items($this->parent[$tag]);

   }else{

    #this is the second instance of$tagthat we've seen. shift around

    if(array_key_exists("$tag attr",$this->parent)){

     $arr=array('0 attr'=>&$this->parent["$tag attr"], &$this->parent[$tag]);

     unset($this->parent["$tag attr"]);

    }else{

     $arr=array(&$this->parent[$tag]);

    }

    $this->parent[$tag] = &$arr;

    $key= 1;

   }

   $this->parent = &$this->parent[$tag];

  }else{

   $key=$tag;

  }

  if($attributes)$this->parent["$key attr"] =$attributes;

  $this->parent = &$this->parent[$key];

  $this->stack[] = &$this->parent;

 }

 functiondata(&$parser,$data){

  if($this->last_opened_tag != NULL) #you don't need to store whitespace in between tags

   $this->data .=$data;

 }

 functionclose(&$parser,$tag){

  if($this->last_opened_tag ==$tag){

   $this->parent =$this->data;

   $this->last_opened_tag = NULL;

  }

  array_pop($this->stack);

  if($this->stack)$this->parent = &$this->stack[count($this->stack)-1];

 }

}

functioncount_numeric_items(&$array){

 returnis_array($array) ?count(array_filter(array_keys($array),'is_numeric')) : 0;

}

?>

时间: 2024-12-02 19:44:24

PHP中XML操作类XML Library的实现的相关文章

C#实现的xml操作类完整实例_C#教程

本文实例讲述了C#实现的xml操作类,分享给大家供大家参考,具体如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System

php实现的xml操作类_php技巧

本文实例讲述了php实现的xml操作类.分享给大家供大家参考,具体如下: <?php /* 使用方法: $test=new xml(); $test->new_xml('test.xml'); $test->root('document'); $test->append_root_node('book'); $test->append_child_node('author','linage'); $test->append_child_node('page',100);

简单的XML操作:XML文件创建

简单的XML操作:XML文件创建把下面的代码复制到按钮事件中编译执行后可在相应物理路径中产生Pos.xml文件 XmlTextWriter xtw = new XmlTextWriter(Request.PhysicalApplicationPath + "Pos.xml",System.Text.Encoding.UTF8); xtw.Formatting = Formatting.Indented; xtw.WriteStartDocument(false); //结果: xtw.

PHP中Memcache操作类及用法实例_php技巧

本文实例讲述了PHP中Memcache操作类及用法.分享给大家供大家参考.具体分析如下: 复制代码 代码如下: <?php      /*  内存缓存管理      */ class Yc_Memcache{   private $memcache=null;       public function __construct(){   }   /**      * 连接数据库      *      * @param mixed $host      * @param mixed $port 

asp.net xml操作方法与xml操作类

程序生成XML文档 这种方式是用 C# 程序生成一个 XML 文件,并将数据放在其中来处理.下面是几种不同的方法实现了同样的目的. 用XmlWriter类编辑数据而实现的简单示例:  代码如下 复制代码 XmlTextWriter xtw = new XmlTextWriter(filePath, Encoding.UTF8); xtw.Formatting = Formatting.Indented; xtw.WriteStartDocument(true); xtw.WriteStartEl

ASP XML操作类代码_应用技巧

复制代码 代码如下: Class XMLClass Private objXml Private xmlDoc Private xmlPath '//============================================================ ' Sub Class_initialize Set objXml = Server.CreateObject("MSXML2.DOMDocument") objXml.preserveWhiteSpace = tru

ASP XML操作类代码

复制代码 代码如下:Class XMLClass Private objXml Private xmlDoc Private xmlPath '//============================================================ ' Sub Class_initialize Set objXml = Server.CreateObject("MSXML2.DOMDocument") objXml.preserveWhiteSpace = true

求一个LINQ TO XML 操作类

问题描述 求一个LINQTOXML操作类 解决方案 解决方案二:google"LINQTOXML",如果你认为这都满足不了你,你可以放弃了解决方案三: 解决方案四:引用2楼q107770540的回复: MSDNLINQTOXML MSDN才是王道,也是最基本的,他是最好的学习工具

C# XML操作类 XmlHelper

using System.Xml; using System.Data; namespace DotNet.Utilities {     /// <summary>     /// Xml的操作公共类     /// </summary>        public class XmlHelper     {         #region 字段定义         /// <summary>         /// XML文件的物理路径         /// &l