标签:
继续以昨天创建的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