标签:
继续以昨天创建的stu.xml文件为目标进行操作。
1、修改
明确几个操作:
A:修改节点->可以用替换replaceChild;
B:修改节点值->nodeValue是可以直接赋值的;
C:修改属性值->setAttribute(),面向对象的类中经常会有这种setXXX、getXXX的操作。
先看一下stu.xml文件的内容:
[root@rh64-ljl xml]# cat stu.xml
<?xml version="1.0" encoding="utf-8"?>
<class>
<studentinfo tag="BeiJing">
<name>lily</name>
<age>18</age>
<city>BeiJing</city>
<addr>street bj8</addr>
</studentinfo>
<studentinfo tag="ShangHai">
<name>lucy</name>
<age>20</age>
<city>ShangHai</city>
<addr>street sh2</addr>
</studentinfo>
</class>
[root@rh64-ljl xml]#
看代码:
<?php
$dom = new DomDocument();
$dom->load(‘stu.xml‘);
$students = $dom->getElementsByTagName(‘studentinfo‘);
foreach($students as $stu){
$tag = $stu->getAttribute(‘tag‘); //获取tag属性的值
if($tag == ‘BeiJing‘){
$stu->setAttribute(‘tag‘,‘China‘); //修改tag属性的值
}
$nameNode = $stu->getElementsByTagName(‘name‘)->item(0); //获取name节点
$nameValue = $nameNode->nodeValue; //获取name节点的值
if($nameValue == ‘lily‘){
$nameNode->nodeValue = ‘meimei‘; //如果name节点的值为lily,则将其改为meimei
}
if($nameValue == ‘lucy‘){
$new = $dom->createElement($nameValue); //创建新的节点
$new->appendChild($dom->createTextNode($nameValue)); //创建新的节点值
$stu->replaceChild($new,$nameNode); //如果name节点的值为lucy,则将其替换
}
}
$dom->save(‘stu.xml‘); //保存
?>
看一下执行后的结果:
[root@rh64-ljl xml]# php modifyXml.php
[root@rh64-ljl xml]# cat stu.xml
<?xml version="1.0" encoding="utf-8"?>
<class>
<studentinfo tag="China">
<name>meimei</name>
<age>18</age>
<city>BeiJing</city>
<addr>street bj8</addr>
</studentinfo>
<studentinfo tag="ShangHai">
<lucy>lucy</lucy>
<age>20</age>
<city>ShangHai</city>
<addr>street sh2</addr>
</studentinfo>
</class>
[root@rh64-ljl xml]#
可以看到:
1.tag属性由BeiJing变成了China;
2.值lily变成了meimei;
3.<name>lucy</name>被替换成了<lucy>lucy</lucy>
既定的目标均能够实现。
2、删除
先明确一下可能的操作:
A.删除节点->removeChild();
B.删除节点值(这个直接用赋值的方法赋个空值就可以,略过);
C.删除属性值->removeAttribute();
还是以本文最顶上的stu.xml文件为目标来进行操作。
看代码:
<?php
$dom = new DomDocument();
$dom->load(‘stu.xml‘);
$stu = $dom->getElementsByTagName(‘studentinfo‘);
foreach($stu as $s){
$s->removeAttribute(‘tag‘); //删除tag属性值
$name = $s->getElementsByTagName(‘name‘)->item(0)->nodeValue;
echo "$name\n";
$s->removeChild($s->getElementsByTagName(‘name‘)->item(0)); //删除name节点
break; //在对第1个studentinfo标记内的内容操作完成后,退出遍历。
}
$x = new domxpath($dom); //换种方法删除下一个,上面的break也是为这考虑
$stuinfo = $x->query("/class/studentinfo"); //定位
$nameNode = $stuinfo->item(1)->getElementsByTagName(‘name‘)->item(0); //item(0)在上面遍历时已完成
$nameValue = $stuinfo->item(1)->getElementsByTagName(‘name‘)->item(0)->nodeValue;
echo "$nameValue\n";
//$stuinfo->item(1)->removeChild($nameNode); //这两个删除的语句实现功能相同
$nameNode->parentNode->removeChild($nameNode);
$dom->save(‘stu.xml‘);
?>
执行一下,看看结果如何:
[root@rh64-ljl xml]# php removeXml.php
lily
lucy
[root@rh64-ljl xml]# cat stu.xml
<?xml version="1.0" encoding="utf-8"?>
<class>
<studentinfo>
<age>18</age>
<city>BeiJing</city>
<addr>street bj8</addr>
</studentinfo>
<studentinfo tag="ShangHai">
<age>20</age>
<city>ShangHai</city>
<addr>street sh2</addr>
</studentinfo>
</class>
[root@rh64-ljl xml]#
可以看到,第1个studeninfo标记内的tag属性已经被删除,name节点也被删除,第2个studentinfo标记内的name节点同样被删除了,但是没有对tag属性进行操作,所以仍然存在。
xml相关的操作就先整理到这儿,创建、查询、修改和删除4种操作都有了。
标签:
原文地址:http://www.cnblogs.com/liangjl/p/4629773.html