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项目的方法
Oct 09 PHP
php实现分页工具类分享
Jan 09 PHP
php中url函数介绍及使用示例
Feb 13 PHP
PHP empty函数报错解决办法
Mar 06 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
分享ThinkPHP3.2中关联查询解决思路
Sep 20 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
PHP单链表的实现代码
Jul 05 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
angular4模块中给标签添加背景图的实现方法
2017/09/15 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
python使用nntp读取新闻组内容的方法
2015/05/08 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
消防工作实施方案
2014/06/09 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
创先争优承诺书
2015/01/20 职场文书
员工辞职信范文
2015/03/02 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python