COOVOl技术论坛 » XML专题研究 » 解析xml文档的一个简单php类 (转到动态网页)
« 1 23» Pages: ( 1/3 total )
本页主题: 解析xml文档的一个简单php类 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

coovol
级别: 圣骑士

 解析xml文档的一个简单php类

原文:http://www4.blog.163.com/article/-3BQ2-r_8RDI.html

//原创,可以自由使用,欢迎提出改进意见,

<?PHP
//xml中的元素
class XMLTag
{
var $parent;//父节点
var $child;//子节点
var $attribute;//本节点属性
var $data;//本节点数据
var $TagName;//本节点名称
var $depth;//本节点的深度,根节点为1
function XMLTag($tag='')
{
  $this->attribute = array();
  $this->child = array();
  $this->depth = 0;
  $this->parent = null;
  $this->data = '';
  $this->TagName = $tag;
}
function SetTagName($tag)
{
  $this->TagName = $tag;
}
function SetParent(&$parent)
{
  $this->parent = &$parent;
}
function SetAttribute($name,$value)
{
  $this->attribute[$name] = $value;
}
function AppendChild(&$child)
{
  $i = count($this->child);
  $this->child[$i] = &$child;
}
function SetData($data)
{
  $this->data= $data;
}
function GetAttr()
{
  return $this->attribute;
}
function GetProperty($name)
{
  return $this->attribute[$name];
}
function GetData()
{
  return $this->data;
}
function GetParent()
{
  return $this->parent;
}
function GetChild()
{
  return $this->child;
}
function GetChildByName($name)
{
  $total = count($this->child);
  for($i=0;$i<$total;$i++)
  {
  if($this->child[$i]->attribute['name'] == $name)
  {
    return $this->child[$i];
  }
  }
  return null;
}
//获取某个tag节点
    function GetElementsByTagName($tag)
    {
    $vector = array();
    $tree = &$this;
    $this->_GetElementByTagName($tree,$tag,$vector);
    return $vector;
    }
    function _GetElementByTagName($tree,$tag,&$vector)
    {
    if($tree->TagName == $tag) array_push($vector,$tree);
    $total = count($tree->child);
    for($i = 0; $i < $total;$i++)
      $this->_GetElementByTagName($tree->child[$i],$tag,$vector);
    }
}
//xml文档解析
class XMLDoc
{
var $parser;//xml解析指针
var $XMLTree;//生成的xml树
var $XMLFile;//将要解析的xml文档
var $XMLData;//将要解析的xml数据
var $error;//错误信息
var $NowTag;//当前指向的节点
var $TreeData;//遍历生成的xml树等到的数据
var $MaxDepth;//本树最大的深度
var $encode;//xml文档的编码方式
var $chs;//字符转换
function XMLDoc()
{
  //采用默认的ISO-8859-1
  $this->parser = xml_parser_create();
  xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);
  xml_set_object($this->parser,&$this);
  xml_set_element_handler($this->parser,'_StartElement','_EndElement');
  xml_set_character_data_handler($this->parser,'_CData');
  $this->stack = array();
  $this->XMLTree = null;
  $this->NowTag = null;
  $this->MaxDepth = 0;
}
function LoadFromFile($file)
{
  $this->XMLFile = fopen($file,'r');
  if(!$this->XMLFile)
  {
  $this->error = '不能打开xml文件';
  return false;
  }
  $this->XMLData = '';
  $this->TreeData = '';
  return true;
}
function SetXMLData($data)
{
  if($this->XMLFile) fclose($this->XMLFile);
  $this->XMLData = $data;
  $this->TreeData = '';
}
//给树添加一个新的节点
function AppendChild(&$child)
{
  if($this->XMLTree == null)
  {
  $child->depth = 1;
  $this->XMLTree = &$child;
  $this->NowTag = &$this->XMLTree;
  }
  else
  {
  $i = count($this->NowTag->child);
  $this->NowTag->child[$i] = &$child;
            $child->parent = &$this->NowTag;
  $child->depth = $this->NowTag->depth+1;
  unset($this->NowTag);
  $this->NowTag = &$child;
  }
  $this->MaxDepth = ($this->MaxDepth < $this->NowTag->depth)?$this->NowTag->depth:$this->MaxDepth;
}

//产生一个新的节点
function &CreateElement($tag)
{
  $element = new XMLTag($tag);
  return $element;
}
function _StartElement($parser,$element,$attribute)
{
  $tag = new XMLTag();
  $tag->TagName = $element;
  $tag->attribute = $attribute;
  if($this->XMLTree == null)
  {
  $tag->parent = null;
  $tag->depth = 1;
  $this->XMLTree = &$tag;
  $this->NowTag = &$tag;
  }
  else
  {
  $i = count($this->NowTag->child);
  $this->NowTag->child[$i] = &$tag;
  $tag->parent = &$this->NowTag;
  $tag->depth = $this->NowTag->depth+1;
  unset($this->NowTag);
  $this->NowTag = &$tag;
  }
  $this->MaxDepth = ($this->MaxDepth < $this->NowTag->depth)?$this->NowTag->depth:$this->MaxDepth;
}
function _CData($paraser,$data)
{
  $this->NowTag->data = $data;
}
function _EndElement($parser,$element)
{
  $parent = &$this->NowTag->parent;
  unset($this->NowTag);
  $this->NowTag = &$parent;
}
//开始解析xml文档
function parse()
{
  if($this->XMLFile)
  {
  $this->XMLData = '';
  while(!feof($this->XMLFile))
  {
    $this->XMLData .= fread($this->XMLFile,4096);
  }
  }
  fclose($this->XMLFile);
  if($this->XMLData)
  {
  //$this->JudgeEncode();
  if (!xml_parse($this->parser, $this->XMLData))
  {
    $code = xml_get_error_code($this->parser);
    $col = xml_get_current_column_number($this->parser);
    $line = xml_get_current_line_number($this->parser);
          $this->error = "XML error: $col at line $line:".xml_error_string($code);
          return false;
  }
  }
  xml_parser_free($this->parser);
  return true;
    }
    //确定编码方式
    function JudgeEncode()
    {
    $start = strpos($this->XMLData,'<?xml');
    $end = strpos($this->XMLData,'>');
    $str = substr($this->XMLData,$start,$end-$start);
    $pos = strpos($str,'encoding');
    if($pos !== false)
    {
      $str = substr($str,$pos);
      $pos = strpos($str,'=');
      $str = substr($str,$pos+1);
      $pos = 0;
      while(empty($str[$pos])) $pos++;
      $this->encode = '';
      while(!empty($str[$pos]) && $str[$pos] != '?')
      {
      if($str[$pos] != '"' && $str[$pos] != "'")
        $this->encode .= $str[$pos];
      $pos++;
      }
    }
    $this->chs = new Chinese('UTF-8',$this->encode);
    }

    //根据节点名称修改某个节点的值
    function ChangeValueByName($name,$name,$value)
    {
    return $this->_ChangeValueByName($this->XMLTree,$name,$value);
    }
    function _ChangeValueByName($tree,$name,$value)
    {
    if(is_array($tree->attribute))
    {
      while (list($k,$v) = each($tree->attribute))
      {
      if($k = 'name' && $v = $name)
      {
        $tree->data = $value;
        return true;
      }
      }
    }
    $total = count($tree->child);
    for($i = 0;$i<$total;$i++)
    {
      $result = $this->_ChangeValueByName($tree->child[$i],$name,$value);
      if($result == true) break;
    }
    return $result;
    }

    //根据节点名称修改树中某个节点的属性
    function ChangeAttrByName($name,$attr,$value)
    {
    return $this->_ChangeAttrByName($this->XMLTree,$name,$attr,$value);
    }
    function _ChangeAttrByName(&$tree,$name,$attr,$value)
    {
    if(is_array($tree->attribute))
    {
      while(list($k,$v) = each($tree->atttibute))
      {
      if($k == 'name' && $v == $name)
      {
        $tree->attribute[$attr] = $value;
        return true;
      }
      }
    }
    $total = count($tree->child);
    for($i = 0;$i<$total;$i++)
    {
      $result = $this->_ChangeAttrByName($tree->child[$i],$name,$attr,$value);
      if($result == true) break;
    }
    return $result;
    }
    //获取根节点
    function GetDocumentElement()
    {
    return $this->XMLTree;
    }
    //遍历生成的xml树,重新生成xml文档
    function WalkTree()
    {
    $this->TreeData = '';
    $this->_WalkTree($this->XMLTree);
    return $this->TreeData;
    }
    //递归遍历
    function _WalkTree($tree)
    {
    $this->TreeData .= '<'.$tree->TagName.' ';
    if(is_array($tree->attribute))
    {
      while(list($key,$value) = each($tree->attribute))
      {
      $this->TreeData .="$key=\"$value\" ";
      }
    }
    $this->TreeData .= '>'.$tree->data;
    $total = count($tree->child);
    for($i=0;$i<$total;$i++)
    {
      $this->_WalkTree($tree->child[$i]);
    }
    $this->TreeData .= '</'.$tree->TagName.">\n";
    }
    //获取错误信息
    function GetError()
    {
    return $this->error;
    }
    //获取树的最大深度
    function GetMaxDepth()
    {
    return $this->MaxDepth;
    }
    //将xml树写入xml文件
    function WriteToFile($file,$head='')
    {
    $fp = fopen($file,'w');
    if(!$fp)
    {
      $this->error = '无法打开写入文件';
      return false;
    }
    if(empty($this->TreeData)) $this->WalkTree();
    $head = empty($head)?'<?xml version="1.0" standalone="yes" encoding="gb2312"?>':$head;
    fwrite($fp,$head);
    fwrite($fp,$this->TreeData);
    fclose($fp);
    return true;
    }
}
?>

顶端 Posted: 2008-03-03 22:30 | From:陕西省西安市 [楼 主]
jklm505
级别: 侠客

 免费视频,激情视频

http://fightingcentury.com/vip2.htm   免费视频,激情视频  大学生外包!
个性签名内容
顶端 Posted: 2008-09-19 12:16 | From:江苏省泰州市 1 楼
tuvw172
级别: 新手上路

 6

----------------------------------------------------------------------------------------------------
深圳国美空调安装 深圳空调 南山装修
顶端 Posted: 2008-09-21 01:40 | From:广东省广州市番禺区 2 楼
pigujin23
级别: 侠客

 深圳俱乐部发生火灾已致43人死亡!!!

9月20日晚23时许,深圳龙岗区龙岗街道龙东社区舞王俱乐部发生一起特大火灾事故,经龙岗区条码打印机消防部门全力扑救,火灾很快被扑灭。据初步统计,截止9月21日凌晨3:30,事故共造成43人死亡,住院51人。

  事故发生后,广东省委书记汪洋指示:一是迅速查明火灾性质;二是迅速控制责任人;三是迅速控制明火,防止死灰复燃;四是迅速救治伤员,标签打印机并作好死者善后及家属安抚工作;五是及时发布信息,公布真相,切实做好社会稳定工作。省长黄华华批示,标签打印机标签打印机标签打印机要举一反三,切实做好全省安全生产工作。

  目前,事故原因正在进一步调查中。
顶端 Posted: 2008-09-21 14:09 | From:上海市闵行区 3 楼
uigdhiuew
级别: 新手上路

 往往会引起反感

顶端 Posted: 2008-09-22 07:38 | From:浙江省杭州市 4 楼
uvwx278
级别: 骑士

 我爱RS

谢谢分享了哈,谢谢了,非常好!

------------------------------------------

runescape money | buy runescape money | runescape money | runescape money | runescape money
yes u can!
顶端 Posted: 2008-09-29 14:40 | From:福建省 5 楼
airpiaowu003
级别: 骑士

 498

学习了,赞一个。

SIGNRTURE_________________________________________________________

我的其它文章:北京机票北京到延吉机票北京到徐州机票北京到西宁机票北京到宜昌机票
顶端 Posted: 2008-09-30 11:02 | From:北京市 6 楼
hongganji55
级别: 侠客

 对辊挤压造粒机

对辊挤压造粒机用途及特点:
     DZJ型对辊挤压式造粒机是我公司自行开发的新一代造粒设备。采用无干燥常温工艺生产,一次成型、产量1-1.5吨/小时、1.5-3吨/小时两种规格。该设备投资少、见效快、经济效益好。成套设备布局紧凑,科学合理,技术先进。节能降耗,无三废排出,操作稳定,运行可靠,维修方便。原料适应性广,适用于复混肥料、医药、化工、饲料等各种原料的造粒,产品成粒率高。能生产各种浓度,多种类型(包括有机肥、无机肥、生物肥、磁化肥等)复混肥。特别是稀土,钾肥、碳铵系列复混肥造粒,填补了国内空白,居国内领先水平。 网址:http://www.zzposuiji.com
顶端 Posted: 2008-10-01 19:27 | From:江苏省镇江市 7 楼
airpiaowu003
级别: 骑士

 212

学习了,赞一个。

SIGNRTURE_________________________________________________________

我的其它文章:北京到罗德兹机票北京到土伦机票北京到阿雅克修机票北京到阿内西机票北京到施特拉斯堡机票
顶端 Posted: 2008-10-01 21:38 | From:北京市 8 楼
hzxsdscz
级别: 骑士

 课件下载

课件下载:八年级数学勾股定理的逆定理
课件下载www.12road.com
顶端 Posted: 2008-10-07 09:04 | From:Unknown 9 楼
« 1 23» Pages: ( 1/3 total )
COOVOl技术论坛 » XML专题研究
快速发帖 顶端
内容
HTML 代码不可用

使用签名
Wind Code自动转换

字数检查 恢复数据
按 Ctrl+Enter 直接提交
表情 [更多]

Powered by PHPWind v6.3.2 Code © 2003-08 PHPWind
This is html template view this page faster