详解PHP原生DOM对象操作XML的方法


Posted in PHP onOctober 17, 2016

一、创建

创建一个新的XML文件,并且写入一些数据到这个XML文件中。

/*
 * 创建xml文件
 */
 
$info = array(
 array('obj' => 'power','info' => 'power is shutdown'),
 array('obj' => 'memcache','info' => 'memcache used than 90%'),
 array('obj' => 'cpu','info' => 'cpu used than 95%'),
 array('obj' => 'disk','info' => 'disk is removed')
);//用来写入的数据
 
$dom = new DOMDocument('1.0');
$dom->formatOutput = true;//格式化
 
$eventList = $dom->createElement('EventList');//创建根节点EventList
$dom->appendChild($eventList);//添加根节点
 
for($i = 0; $i < count($info); $i++){
 $event = $dom->createElement('event');//创建节点event
 $text = $dom->createTextNode('PHP'.$i);//创建文本节点,值为PHP0,PHP1...
 $event->appendChild($text);//将文本节点添加到节点event,做为节点event的值
 
 $attr_obj = $dom->createAttribute('obj');//创建属性obj
 $attr_obj->value = $info[$i]['obj'];//为obj属性赋值
 $event->appendChild($attr_obj);//将obj属性添加到event节点中,做为event节点的属性
 
 $attr_info = $dom->createAttribute('info');
 $attr_info->value = $info[$i]['info'];
 $event->appendChild($attr_info);
 
 $eventList->appendChild($event);//将event节点添加到根节点EventList中
}
 
//echo $dom->saveXML();
$dom->save('./t.xml');//保存信息到当前目录下的t.xml文件中

上面的代码段可以创建一个XML文件,并添加一些信息到这个文件中,包括值和属性,最终形成的文件为当前目录下的t.xml,可以看一下它的内容。

<?xml version="1.0"?>
<EventList>
 <event obj="power" info="power is shutdown">PHP0</event>
 <event obj="memcache" info="memcache used than 90%">PHP1</event>
 <event obj="cpu" info="cpu used than 95%">PHP2</event>
 <event obj="disk" info="disk is removed">PHP3</event>
</EventList>

二、读取XML信息&添加新的属性

以上一节创建的t.xml文件为操作对象,读取出t.xml文件中的信息,并给节点添加一个新的属性count,其值为1。

/*
 * 读取xml文件信息,并添加新的属性
 */
 
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');//加载要操作的文件
$list = $dom->getElementsByTagName('event');//获取event节点列表
foreach($list as $item){
 $attr_obj = $item->getAttribute('obj');//获取属性obj的值
 $attr_info = $item->getAttribute('info');
 echo "<pre>Object:$attr_obj;Info:$attr_info;Value:{$item->nodeValue}</pre>";
 $item->setAttribute('count',1);//添加新的属性count=1
}
$dom->save('./t.xml');//保存修改

看一下提取到的值:

Object:power;Info:power is shutdown;Value:PHP0
 
Object:memcache;Info:memcache used than 90%;Value:PHP1
 
Object:cpu;Info:cpu used than 95%;Value:PHP2
 
Object:disk;Info:disk is removed;Value:PHP3

再看一下现在的t.xml文件的内容,count属性已经添加上。

<?xml version="1.0"?>
<EventList>
 <event obj="power" info="power is shutdown" count="1">PHP0</event>
 <event obj="memcache" info="memcache used than 90%" count="1">PHP1</event>
 <event obj="cpu" info="cpu used than 95%" count="1">PHP2</event>
 <event obj="disk" info="disk is removed" count="1">PHP3</event>
</EventList>

三、修改节点属性&节点值

以上一节中的t.xml文件为操作对象,修改一下obj属性是cpu的节点的count值,新的值为count+1

/*
 * 修改某一个节点的属性和值
 */
 
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');
$list = $dom->getElementsByTagName('event');
foreach($list as $item){
 $attr_obj = $item->getAttribute('obj');
 if($attr_obj == 'cpu'){//修改cpu的count属性,使其值+1
  $attr_count = $item->getAttribute('count');//获取count属性的值
  $item->setAttribute('count',$attr_count+1);//重置count属性的值
  $item->nodeValue = 'Hello,Kitty';//重置节点的值
 }
}
$dom->save('./t.xml');

操作后的t.xml文件如下,要以看到obj=cpu的节点的count属性已经改变,值也修改成功。

<?xml version="1.0"?>
<EventList>
 <event obj="power" info="power is shutdown" count="1">PHP0</event>
 <event obj="memcache" info="memcache used than 90%" count="1">PHP1</event>
 <event obj="cpu" info="cpu used than 95%" count="2">Hello,Kitty</event>
 <event obj="disk" info="disk is removed" count="1">PHP3</event>
</EventList>

四、删除节点

要添加就会有删除。以上节的t.xml文件为操作对象,删除obj=disk的节点。

/*
 * 删除节点
 */
 
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');
$list = $dom->getElementsByTagName('event');
foreach($list as $item){
 if($item->getAttribute('obj') == 'disk'){//以obj=disk的节点为操作对象
  $item->parentNode->removeChild($item);//删除节点
 }
}
$dom->save('./t.xml');

看一下操作后的t.xml文件内容,obj=disk的节点已被成功删除。

<?xml version="1.0"?>
<EventList>
 <event obj="power" info="power is shutdown" count="1">PHP0</event>
 <event obj="memcache" info="memcache used than 90%" count="1">PHP1</event>
 <event obj="cpu" info="cpu used than 95%" count="2">Hello,Kitty</event>
 
</EventList>

向根节点中添加新的子节点

以上一节的t.xml为操作对象,向根节点EventList中添加一个新的子节点。

/*
 * 向EventList中添加一个子节点
 */
 
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');
$event_list = $dom->getElementsByTagName('EventList');//获取根节点
$event = $dom->createElement('event','lenovo');//新建节点
$event_list->item(0)->appendChild($event);//将新建节点添加到根节点中
 
$event_attr_obj = $dom->createAttribute('obj');
$event_attr_obj->value = 'lenovo';
$event->appendChild($event_attr_obj);
 
$event_attr_info = $dom->createAttribute('info');
$event_attr_info->value = 'thinkpad t430';
$event->appendChild($event_attr_info);
 
$dom->save('./t.xml');

看一下操作后的t.xml文件内容,新的子节点已经被插入到根节点中。

<?xml version="1.0"?>
<EventList>
 <event obj="power" info="power is shutdown" count="1">PHP0</event>
 <event obj="memcache" info="memcache used than 90%" count="1">PHP1</event>
 <event obj="cpu" info="cpu used than 95%" count="2">Hello,Kitty</event>
 
<event obj="lenovo" info="thinkpad t430">lenovo</event></EventList>

五、关于item($index)

item(index)是DOMNodeList类中的一个方法,它的做用是返回一个由索引指明的节点。而DOMDocument类中的getElementsByTagName(name)方法返回的正是一个DOMNodeList对象的实例,所以可以直接调用item(index)方法。以上节的t.xml为示例,如果e=dom−>getElementsByTagName(‘EventList′)获取EventList节点的信息,因为EventList节点是根节点,有且仅有一个,所以它调用item(index)时,索引只有index=0可用,因为它只有1个;而如果e=dom−>getElementsByTagName(‘event′)获取event节点的信息,因为event有4个,所以它调用item(index)时,索引$index={0,1,2,3} ,有4个值可以选。每个节点都包含多个属性,它可以以一种键值对数组的形式表现出来,如下所示:

object(DOMElement)#3 (18) {
 ["tagName"]=>
 string(5) "event"
 ["schemaTypeInfo"]=>
 NULL
 ["nodeName"]=>
 string(5) "event"
 ["nodeValue"]=>
 string(11) "Hello,Kitty"
 ["nodeType"]=>
 int(1)
 ["parentNode"]=>
 string(22) "(object value omitted)"
 ["childNodes"]=>
 string(22) "(object value omitted)"
 ["firstChild"]=>
 string(22) "(object value omitted)"
 ["lastChild"]=>
 string(22) "(object value omitted)"
 ["previousSibling"]=>
 string(22) "(object value omitted)"
 ["nextSibling"]=>
 string(22) "(object value omitted)"
 ["attributes"]=>
 string(22) "(object value omitted)"
 ["ownerDocument"]=>
 string(22) "(object value omitted)"
 ["namespaceURI"]=>
 NULL
 ["prefix"]=>
 string(0) ""
 ["localName"]=>
 string(5) "event"
 ["baseURI"]=>
 string(36) "file:/H:/xampp/htdocs/demo/xml/t.xml"
 ["textContent"]=>
 string(11) "Hello,Kitty"
}

也可以当做对象的属性来用,例如获取这个节点的值:

/*
 * 关于item()
 */
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');
$e = $dom->getElementsByTagName('event');
echo $e->item(2)->nodeValue;
//var_dump($e->item(2));
// $e = $dom->getElementsByTagName('EventList');
// var_dump($e->item(0));
//var_dump($e->item(0)->baseURI);
// for($i=0;$i<$e->length;$i++){
//  echo $e->item($i)->nodeValue;
// }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用PHP能有所帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
php.ini中文版
Oct 09 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
关于js与php互相传值的介绍
Jun 25 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
php常用图片处理类
Mar 16 PHP
php对xml文件的增删改查操作实现方法分析
May 19 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
PHP高并发和大流量解决方案整理
Dec 24 PHP
php排序算法实例分析
Oct 17 #PHP
基于thinkPHP框架实现留言板的方法
Oct 17 #PHP
php并发加锁示例
Oct 17 #PHP
thinkPHP自动验证、自动添加及表单错误问题分析
Oct 17 #PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 #PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 #PHP
php根据数据id自动生成编号的实现方法
Oct 16 #PHP
You might like
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
python取余运算符知识点详解
2019/06/27 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
深入理解Python 多线程
2020/06/16 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
光电信息专业应届生求职信
2013/10/07 职场文书
中央空调节能方案
2014/06/15 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2014年秘书工作总结
2014/11/25 职场文书
二手房购房意向书
2015/05/09 职场文书
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js