PHP 原生 DOM 对象操作 XML

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

创建

创建一个新的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,可以看一下它的内容。

<EventList>

<eventobj="power" info="power is shutdown">PHP0event>

<eventobj="memcache" info="memcache used than 90%">PHP1event>

<eventobj="cpu" info="cpu used than 95%">PHP2event>

<eventobj="disk" info="disk is removed">PHP3event>EventList>

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

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

/*

* 读取xml文件信息,并添加新的属性

*/

$dom = new DOMDocument(’1.0’);

$dom->load(’./t.xml’);//加载要操作的文件

$list = $dom->getElementsByTagName(’event’);//获取event节点列表foreach($listas $item){

$attr_obj = $item->getAttribute(’obj’);//获取属性obj的值

$attr_info = $item->getAttribute(’info’);

echo "

Object:$attr_obj;Info:$attr_info;Value:{$item->nodeValue}

";

$item->setAttribute(’count’,1);//添加新的属性count=1

}

$dom->save(’./t.xml’);//保存修改

看一下提取到的值:

Object:power;Info:poweris shutdown;Value:PHP0

Object:memcache;Info:memcacheusedthan 90%;Value:PHP1

Object:cpu;Info:cpuusedthan 95%;Value:PHP2

Object:disk;Info:diskis removed;Value:PHP3

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

<EventList>

<eventobj="power" info="power is shutdown" count="1">PHP0event>

<eventobj="memcache" info="memcache used than 90%" count="1">PHP1event>

<eventobj="cpu" info="cpu used than 95%" count="1">PHP2event>

<eventobj="disk" info="disk is removed" count="1">PHP3event>EventList>

修改节点属性&节点值

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

/*

* 修改某一个节点的属性和值

*/

$dom = new DOMDocument(’1.0’);

$dom->load(’./t.xml’);

$list = $dom->getElementsByTagName(’event’);foreach($listas $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属性已经改变,值也修改成功。

<EventList>

<eventobj="power" info="power is shutdown" count="1">PHP0event>

<eventobj="memcache" info="memcache used than 90%" count="1">PHP1event>

<eventobj="cpu" info="cpu used than 95%" count="2">Hello,Kittyevent>

<eventobj="disk" info="disk is removed" count="1">PHP3event>EventList>

删除节点

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

/*

* 删除节点

*/

$dom = new DOMDocument(’1.0’);

$dom->load(’./t.xml’);

$list = $dom->getElementsByTagName(’event’);foreach($listas $item){

if($item->getAttribute(’obj’) == ’disk’){//以obj=disk的节点为操作对象

$item->parentNode->removeChild($item);//删除节点

}

}

$dom->save(’./t.xml’);

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

<EventList>

<eventobj="power" info="power is shutdown" count="1">PHP0event>

<eventobj="memcache" info="memcache used than 90%" count="1">PHP1event>

<eventobj="cpu" info="cpu used than 95%" count="2">Hello,Kittyevent>

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文件内容,新的子节点已经被插入到根节点中。

<EventList>

<eventobj="power" info="power is shutdown" count="1">PHP0event>

<eventobj="memcache" info="memcache used than 90%" count="1">PHP1event>

<eventobj="cpu" info="cpu used than 95%" count="2">Hello,Kittyevent>

<eventobj="lenovo" info="thinkpad t430">lenovoevent>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;

// }

文章来源:伯乐在线

时间: 2024-10-12 01:48:25

PHP 原生 DOM 对象操作 XML的相关文章

PHP原生DOM对象操作XML&#39;代码&#39;

对于操作XML类型文件,PHP内置有一套DOM对象可以进行处理.对XML的操作,从创建.添加到修改.删除都可以使用DOM对象中的函数来进行. 创建 创建一个新的XML文件,并且写入一些数据到这个XML文件中. /* * 创建xml文件 */ $info = array( array('obj' => 'power','info' => 'power is shutdown'), array('obj' => 'memcache','info' => 'memcache used t

XML编程总结(二)——使用DOM接口操作xml

(二)使用DOM接口操作xml DOM解析器将整个XML文档加载到内存中,使用DOM模型对XML文档在内存中建模.DOM解析器被称为DocumentBuilder,它位于javax.xml.parsers包下.下面是使用DOM对xml文档进行CRUD操作的演示. 测试类代码:Source和Result接口的使用,将内存中xml模型输出 1 public class DomTest { 2 private Document document; 3 4 @Before 5 public void s

JQ对象和原生DOM对象

相同点:两者本质上都是DOM元素. 不同点:JQ对象是在原生DOM对象上进行了一次封装,使开发人员使用起来更简洁.高效. 两者之间用法也完全不同,很说初学者经常混淆. 其实区分两者并不难, 1.语法不一样,JQ对象都是以$开头的,API也不一样(具体请查询JQ手册).     比如:$('#a').html()    //这样写就可以拿到id 叫 a里面的内容. 如果   $('#a').innerHTML  // 这样写就会报错,而且拿不到任何内容,原因就是$('#a')是JQ对象,而inne

xerces-c用DOM方式操作xml

xerces-c是一个可以校验XML合法性的XML解析器,它的语言是C++,它的官方主页:http://xml.apache.org/xerces-c.它支持下面这些标准:XML 1.0 ,XML 1.1 ,DOM 1, 2, 3 , SAX 1.0 和SAX 2.0, XML Schema. xerces操作XML主要是分几步: 先调用XMLPlatformUtils::Initialize初始化环境,其中最重要是初始化内存管理器.如果没有调用这个,直接进行下面的步骤,程序会崩溃. 使用Xer

jQuery对象与JS原生dom对象之间的转换

jQuery就是JS的一个扩展库,工具库,提供很多方便快捷的方法,所以将JS对象转换为jQuery对象后,能更方便地操作这个对象.但是jQuery对象也不是万能的,有一些JS对象有的能,jQuery对象并没有提供,所以需要转换回JS对象,才能进行操作.另外一种情况可能是,你使用某些第三方库,接口函数只能接受JS对象或者jQuery对象,那么你就需要在这两者之间进行转换. 1.将jQuery转换为dom对象的方法 [index] 或者.get(index): a.$(“#form”)[index]

js中常用的browser和dom对象操作总结

一.常用的Window对象操作 Window对象中又包含了document.history.location.Navigator和screen几个对象,每个对象又有自己的属性方法,这里window可以省略. 如window.location.href  可以简写为location.href //返回运行浏览器的操作系统和(或)硬件平台 var platform = navigator.platform; //浏览器的代码名 var appCodeName = navigator.appCodeN

dom对象操作Html,Css

HTML: 1.不要再文档加载完使用document.write,这样会创建新的dom对象,原来的元素将被覆盖. 2.获取元素,通过getElementbyID; getElementbyTag("p")(相同元素的第一个) 3.改变属性.getElementbyID('id').href="www.baidu.com"; CSS: 1. 语法document.getElementById(id).style.property = new style; docume

htm Dom对象与 Xml Dom对象的理解

html 是基于Xml的文档规范.是一种特殊的xml文档,这一点很重要 1.xml 文档的操作,java,c#,...各种语言都提供了很好的api对文档进行解析,操作.当然js 也不例外,提供了一系列的方法. 具体的方法,w3c 上都有讲解.Document,Node,   ElementNode,TextNode,AttributeNode,CommentNode,NodeList 这些都是xml的属性 xml 里面每个节点都是一个node对象, 2.html 是一种特殊的xml文档,那么特殊

Js:DOM对象操作常用的方法和属性