0

0

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

php中文网

php中文网

发布时间:2016-06-21 09:05:47

|

1256人浏览过

|

来源于php中文网

原创

xml

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

//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  {
   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       $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 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 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,'     $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     {
      $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     {
      $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 .= '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     {
      $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)?'':$head;
     fwrite($fp,$head);
     fwrite($fp,$this->TreeData);
     fclose($fp);
     return true;
    }
}
?>



PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
微信文件过期恢复教程
微信文件过期恢复教程

本专题整合了微信文件过期恢复方法、技巧教程,阅读专题下面的文章了解更多详细内容。

0

2026.02.04

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

63

2026.02.04

学习通网页版入口与在线学习指南 学习通官网登录与使用方法
学习通网页版入口与在线学习指南 学习通官网登录与使用方法

本专题详细汇总了学习通网页版入口与登录方法,提供学习通官方网页端入口、学生登录平台、网页版使用指南等内容,帮助用户快速稳定地登录学习通官网,顺利进入学习平台,提升学习效率和体验。

9

2026.02.04

Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

9

2026.02.04

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

3

2026.02.04

Golang 容器化与 Docker 实战
Golang 容器化与 Docker 实战

本专题深入讲解 Golang 应用的容器化与 Docker 部署,涵盖 Docker 基础概念、容器构建与镜像管理、Go 应用的 Dockerfile 编写、跨平台容器部署与优化、Docker Compose 和 Kubernetes 部署工具。通过实际案例,帮助学习者掌握 如何将 Golang 应用容器化并实现高效部署与管理,提升系统的可扩展性与运维效率。

3

2026.02.04

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

59

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

110

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

56

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
JavaScript高级框架设计视频教程
JavaScript高级框架设计视频教程

共22课时 | 3.6万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.3万人学习

CSS3实现按钮特效视频教程
CSS3实现按钮特效视频教程

共15课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号