当前位置:Gxlcms > PHP教程 > PHP原生DOM对象操作XML

PHP原生DOM对象操作XML

时间:2021-07-01 10:21:17 帮助过:5人阅读

对于操作XML类型文件,PHP内置有一套DOM对象可以进行处理。对XML的操作,从创建、添加到修改、删除都可以使用DOM对象中的函数来进行。

创建

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

  1. /*
  2. * 创建xml文件
  3. */
  4. $info = array(
  5. array('obj' => 'power','info' => 'power is shutdown'),
  6. array('obj' => 'memcache','info' => 'memcache used than 90%'),
  7. array('obj' => 'cpu','info' => 'cpu used than 95%'),
  8. array('obj' => 'disk','info' => 'disk is removed')
  9. );//用来写入的数据
  10. $dom = new DOMDocument('1.0');
  11. $dom->formatOutput = true;//格式化
  12. $eventList = $dom->createElement('EventList');//创建根节点EventList
  13. $dom->appendChild($eventList);//添加根节点
  14. for($i = 0; $i < count($info); $i++){
  15. $event = $dom->createElement('event');//创建节点event
  16. $text = $dom->createTextNode('PHP'.$i);//创建文本节点,值为PHP0,PHP1...
  17. $event->appendChild($text);//将文本节点添加到节点event,做为节点event的值
  18. $attr_obj = $dom->createAttribute('obj');//创建属性obj
  19. $attr_obj->value = $info[$i]['obj'];//为obj属性赋值
  20. $event->appendChild($attr_obj);//将obj属性添加到event节点中,做为event节点的属性
  21. $attr_info = $dom->createAttribute('info');
  22. $attr_info->value = $info[$i]['info'];
  23. $event->appendChild($attr_info);
  24. $eventList->appendChild($event);//将event节点添加到根节点EventList中
  25. }
  26. //echo $dom->saveXML();
  27. $dom->save('./t.xml');//保存信息到当前目录下的t.xml文件中

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

  1. <?xml version="1.0"?>
  2. <EventList>
  3. <event obj="power" info="power is shutdown">PHP0</event>
  4. <event obj="memcache" info="memcache used than 90%">PHP1</event>
  5. <event obj="cpu" info="cpu used than 95%">PHP2</event>
  6. <event obj="disk" info="disk is removed">PHP3</event>
  7. </EventList>

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


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

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

看一下提取到的值:

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

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

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

修改节点属性&节点值

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

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

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

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

删除节点

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

  1. /*
  2. * 删除节点
  3. */
  4. $dom = new DOMDocument('1.0');
  5. $dom->load('./t.xml');
  6. $list = $dom->getElementsByTagName('event');
  7. foreach($list as $item){
  8. if($item->getAttribute('obj') == 'disk'){//以obj=disk的节点为操作对象
  9. $item->parentNode->removeChild($item);//删除节点
  10. }
  11. }
  12. $dom->save('./t.xml');

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

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

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


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

  1. /*
  2. * 向EventList中添加一个子节点
  3. */
  4. $dom = new DOMDocument('1.0');
  5. $dom->load('./t.xml');
  6. $event_list = $dom->getElementsByTagName('EventList');//获取根节点
  7. $event = $dom->createElement('event','lenovo');//新建节点
  8. $event_list->item(0)->appendChild($event);//将新建节点添加到根节点中
  9. $event_attr_obj = $dom->createAttribute('obj');
  10. $event_attr_obj->value = 'lenovo';
  11. $event->appendChild($event_attr_obj);
  12. $event_attr_info = $dom->createAttribute('info');
  13. $event_attr_info->value = 'thinkpad t430';
  14. $event->appendChild($event_attr_info);
  15. $dom->save('./t.xml');

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

  1. <?xml version="1.0"?>
  2. <EventList>
  3. <event obj="power" info="power is shutdown" count="1">PHP0</event>
  4. <event obj="memcache" info="memcache used than 90%" count="1">PHP1</event>
  5. <event obj="cpu" info="cpu used than 95%" count="2">Hello,Kitty</event>
  6. <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个值可以选。每个节点都包含多个属性,它可以以一种键值对数组的形式表现出来,如下所示:

  1. object(DOMElement)#3 (18) {
  2. ["tagName"]=>
  3. string(5) "event"
  4. ["schemaTypeInfo"]=>
  5. NULL
  6. ["nodeName"]=>
  7. string(5) "event"
  8. ["nodeValue"]=>
  9. string(11) "Hello,Kitty"
  10. ["nodeType"]=>
  11. int(1)
  12. ["parentNode"]=>
  13. string(22) "(object value omitted)"
  14. ["childNodes"]=>
  15. string(22) "(object value omitted)"
  16. ["firstChild"]=>
  17. string(22) "(object value omitted)"
  18. ["lastChild"]=>
  19. string(22) "(object value omitted)"
  20. ["previousSibling"]=>
  21. string(22) "(object value omitted)"
  22. ["nextSibling"]=>
  23. string(22) "(object value omitted)"
  24. ["attributes"]=>
  25. string(22) "(object value omitted)"
  26. ["ownerDocument"]=>
  27. string(22) "(object value omitted)"
  28. ["namespaceURI"]=>
  29. NULL
  30. ["prefix"]=>
  31. string(0) ""
  32. ["localName"]=>
  33. string(5) "event"
  34. ["baseURI"]=>
  35. string(36) "file:/H:/xampp/htdocs/demo/xml/t.xml"
  36. ["textContent"]=>
  37. string(11) "Hello,Kitty"
  38. }

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

  1. /*
  2. * 关于item()
  3. */
  4. $dom = new DOMDocument('1.0');
  5. $dom->load('./t.xml');
  6. $e = $dom->getElementsByTagName('event');
  7. echo $e->item(2)->nodeValue;
  8. //var_dump($e->item(2));
  9. // $e = $dom->getElementsByTagName('EventList');
  10. // var_dump($e->item(0));
  11. //var_dump($e->item(0)->baseURI);
  12. // for($i=0;$i<$e->length;$i++){
  13. // echo $e->item($i)->nodeValue;
  14. // }

以上就是PHP 原生 DOM 对象操作 XML的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!

人气教程排行