PHP封装的XML简单操作类完整实例


Posted in PHP onNovember 13, 2017

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

xml_dom.php封装类文件:

<?php
/**
 * Class xml_dom
 *
nodeType:
1 XML_ELEMENT_NODE(元素类型)
2 XML_ATTRIBUTE_NODE
3 XML_TEXT_NODE
4 XML_CDATA_SECTION_NODE
5 XML_ENTITY_REFERENCE_NODE
6 XML_ENTITY_NODE
7 XML_PROCESSING_INSTRUCTION_NODE
8 XML_COMMENT_NODE(注释类型)
9 XML_DOCUMENT_NODE
10 XML_DOCUMENT_TYPE_NODE
11 XML_DOCUMENT_FRAGMENT_NODE
12 XML_NOTATION_NODE
 *
PHP DOMDocument操作:
属性:
Attributes   存储节点的属性列表(只读)
childNodes   存储节点的子节点列表(只读)
dataType   返回此节点的数据类型
Definition   以DTD或XML模式给出的节点的定义(只读)
Doctype   指定文档类型节点(只读)
documentElement   返回文档的根元素(可读写)
firstChild   返回当前节点的第一个子节点(只读)
Implementation   返回XMLDOMImplementation对象
lastChild   返回当前节点最后一个子节点(只读)
nextSibling   返回当前节点的下一个兄弟节点(只读)
nodeName   返回节点的名字(只读)
nodeType   返回节点的类型(只读)
nodeTypedValue   存储节点值(可读写)
nodeValue   返回节点的文本(可读写)
ownerDocument   返回包含此节点的根文档(只读)
parentNode   返回父节点(只读)
Parsed   返回此节点及其子节点是否已经被解析(只读)
Prefix   返回名称空间前缀(只读)
preserveWhiteSpace   指定是否保留空白(可读写)
previousSibling   返回此节点的前一个兄弟节点(只读)
Text   返回此节点及其后代的文本内容(可读写)
url   返回最近载入的XML文档的URL(只读)
Xml   返回节点及其后代的XML表示(只读)
方法:
appendChild   为当前节点添加一个新的子节点,放在最后的子节点后
cloneNode   返回当前节点的拷贝
createAttribute   创建新的属性
createCDATASection   创建包括给定数据的CDATA段
createComment   创建一个注释节点
createDocumentFragment   创建DocumentFragment对象
createElement   创建一个元素节点
createEntityReference   创建EntityReference对象
createNode   创建给定类型,名字和命名空间的节点
createPorcessingInstruction   创建操作指令节点
createTextNode   创建包括给定数据的文本节点
getElementsByTagName   返回指定名字的元素集合
hasChildNodes   返回当前节点是否有子节点
insertBefore   在指定节点前插入子节点
Load   导入指定位置的XML文档
loadXML   导入指定字符串的XML文档
removeChild   从子结点列表中删除指定的子节点
replaceChild   从子节点列表中替换指定的子节点
Save   把XML文件存到指定节点
selectNodes   对节点进行指定的匹配,并返回匹配节点列表
selectSingleNode   对节点进行指定的匹配,并返回第一个匹配节点
transformNode   使用指定的样式表对节点及其后代进行转换
 *
 */
class xml_dom
{
  protected $dblink; // xml连接
  protected $dbfile; // xml文件路径
  /**
   * xml文件 构造类
   * @param $db_file xml文件
   */
  public function __construct($db_file)
  {
    $this->dbfile = $db_file;
    if(!file_exists($db_file))
    {
//     die('未找到数据库文件');
      $this->dblink = new DOMDocument('1.0', 'utf-8');
      $root = $this->dblink->createElement('root');
      $this->dblink->appendChild($root);
      $this->dblink->formatOutput = true;  // xml文件保留缩进样式
      $this->dblink->save($this->dbfile);
    }
    else
    {
      $this->dblink = new DOMDocument();
      $this->dblink->formatOutput = true;
      $this->dblink->load($this->dbfile);
    }
  }
  /**
   * 遍历所有元素
   * ===============================================
   * 标准xml文件,一个元素可能有n个属性,可用自定义键[nodevalue]获取元素值
   * <?xml version="1.0" encoding="utf-8"?>
   * <table name="posts">
   *   <column name="id">1</column>
   *   <column name="title">标题一</column>
   *   <column name="content">详细内容一</column>
   * </table>
   * ===============================================
   * 简单xml文件,没有属性,键值一一对应
   * <?xml version="1.0" encoding="utf-8"?>
   * <root>
   *   <posts>
   *     <id>1</id>
   *     <title>标题一</title>
   *     <content>详细内容一</content>
   *   </posts>
   * </root>
   * @param $node
   * @return array
   */
  function getData($node=0){
    if(!$node)
    {
      $node = $this->dblink->documentElement;
    }
    $array = array();
    foreach($node->attributes as $attribute)
    {
      $key = $attribute->nodeName;
      $val = $attribute->nodeValue;
      $array[$key] = $val;
    }
    if(count($array))  // 有属性,则用[nodevalue]键代表值
    {
      $array['nodevalue'] = $node->nodeValue;
    }
    // 递归遍历所有子元素
    $node_child = $node->firstChild;
    while($node_child)
    {
      if(XML_ELEMENT_NODE == $node_child->nodeType)
      {
        $tagname = $node_child->tagName;
        $result = $this->getData($node_child);
        if(isset($array[$tagname])) // 发现有重复tagName的子元素存在,所以改用数组存储重复tagName的所有子元素
        {
          if(!is_array($array[$tagname][0]))
          {
            $tmp = $array[$tagname];
            $array[$tagname] = array();
            $array[$tagname][] = $tmp;
          }
          $array[$tagname][] = $result;
        }
        else
        {
          $array[$tagname] = $result;
        }
      }
      $node_child = $node_child->nextSibling;
    }
    if(!count($array)) // 没有子元素&没有属性=最末子元素,就返回该元素的nodeValue值
    {
      return $node->nodeValue;
    }
    return $array;
  }
  /**
   * 把array数据写到xml文件(覆盖)
   * @param $data
   */
  public function setData($data,&$node=0)
  {
    $is_root = false;
    if(!$node)
    {
      $is_root = true;
      $node = $this->dblink->documentElement;
      // 清除原数据
      $remove = array();
      $node_child = $node->firstChild;
      while($node_child)
      {
        $remove[] = $node_child;
        $node_child = $node_child->nextSibling;
      }
      foreach($remove as $r)
      {
        $node->removeChild($r);
      }
    }
    if(is_array($data))
    {
      foreach($data as $k=>$v)
      {
        if(is_array($v))
        {
          foreach($v as $r)
          {
            $item = $this->dblink->createElement($k);
            $result = $this->setData($r,$item);
            $node->appendChild($result);
          }
        }
        else
        {
          $item = $this->dblink->createElement($k);
          $value = $this->dblink->createTextNode($v);
          $item->appendChild($value);
          $node->appendChild($item);
        }
      }
    }
    else
    {
      $item = $this->dblink->createTextNode($data);
      $node->appendChild($item);
    }
    if($is_root)
    {
      $this->dblink->save($this->dbfile);  // 覆盖写入
    }
    else
    {
      return $node;
    }
  }
}

简单用法示例如下:

smp.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<root>
   <posts>
     <id>1</id>
     <title>标题一</title>
     <content>详细内容一</content>
   </posts>
   <posts>
     <id>2</id>
     <title>标题二</title>
     <content>详细内容二</content>
   </posts>
   <posts>
     <id>3</id>
     <title>标题三</title>
     <content>详细内容三</content>
   </posts>
</root>

index.php文件:

include("xml_dom.php");
$xml=new xml_dom("smp.xml");//载入xml文件
$xmlarr=$xml->getData();//读取xml文件内容
var_dump($xmlarr);

运行结果:

array(1) {
 ["posts"]=>
 array(3) {
  [0]=>
  array(3) {
   ["id"]=>
   string(1) "1"
   ["title"]=>
   string(9) "标题一"
   ["content"]=>
   string(15) "详细内容一"
  }
  [1]=>
  array(3) {
   ["id"]=>
   string(1) "2"
   ["title"]=>
   string(9) "标题二"
   ["content"]=>
   string(15) "详细内容二"
  }
  [2]=>
  array(3) {
   ["id"]=>
   string(1) "3"
   ["title"]=>
   string(9) "标题三"
   ["content"]=>
   string(15) "详细内容三"
  }
 }
}
PHP 相关文章推荐
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
yii实现级联下拉菜单的方法
Jul 31 PHP
smarty模板引擎中自定义函数的方法
Jan 22 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 #PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 #PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 #PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 #PHP
PHP 断点续传实例详解
Nov 11 #PHP
PHP+AJAX 投票器功能
Nov 11 #PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 #PHP
You might like
PHP 错误之引号中使用变量
2009/05/04 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
js实现简单扫雷
2020/11/27 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
vue监听滚动事件的方法
2020/12/21 Vue.js
javascript实现简单留言板案例
2021/02/09 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
Python re模块介绍
2014/11/30 Python
linux下python抓屏实现方法
2015/05/22 Python
利用python写个下载teahour音频的小脚本
2017/05/08 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python根据url地址下载小文件的实例
2018/12/18 Python
Django 限制访问频率的思路详解
2019/12/24 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
Python与C/C++的相互调用案例
2021/03/04 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
社团招新策划书
2014/02/04 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
校本培训个人总结
2015/02/28 职场文书
学校会议通知范文
2015/04/15 职场文书