詳解PHP原生DOM對象操作XML的方法
一、創(chuàng)建
創(chuàng)建一個(gè)新的XML文件,并且寫入一些數(shù)據(jù)到這個(gè)XML文件中。
/*
* 創(chuàng)建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')
);//用來寫入的數(shù)據(jù)
$dom = new DOMDocument('1.0');
$dom->formatOutput = true;//格式化
$eventList = $dom->createElement('EventList');//創(chuàng)建根節(jié)點(diǎn)EventList
$dom->appendChild($eventList);//添加根節(jié)點(diǎn)
for($i = 0; $i < count($info); $i++){
$event = $dom->createElement('event');//創(chuàng)建節(jié)點(diǎn)event
$text = $dom->createTextNode('PHP'.$i);//創(chuàng)建文本節(jié)點(diǎn),值為PHP0,PHP1...
$event->appendChild($text);//將文本節(jié)點(diǎn)添加到節(jié)點(diǎn)event,做為節(jié)點(diǎn)event的值
$attr_obj = $dom->createAttribute('obj');//創(chuàng)建屬性obj
$attr_obj->value = $info[$i]['obj'];//為obj屬性賦值
$event->appendChild($attr_obj);//將obj屬性添加到event節(jié)點(diǎn)中,做為event節(jié)點(diǎn)的屬性
$attr_info = $dom->createAttribute('info');
$attr_info->value = $info[$i]['info'];
$event->appendChild($attr_info);
$eventList->appendChild($event);//將event節(jié)點(diǎn)添加到根節(jié)點(diǎn)EventList中
}
//echo $dom->saveXML();
$dom->save('./t.xml');//保存信息到當(dāng)前目錄下的t.xml文件中
上面的代碼段可以創(chuàng)建一個(gè)XML文件,并添加一些信息到這個(gè)文件中,包括值和屬性,最終形成的文件為當(dāng)前目錄下的t.xml,可以看一下它的內(nèi)容。
<?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信息&添加新的屬性
以上一節(jié)創(chuàng)建的t.xml文件為操作對象,讀取出t.xml文件中的信息,并給節(jié)點(diǎn)添加一個(gè)新的屬性count,其值為1。
/*
* 讀取xml文件信息,并添加新的屬性
*/
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');//加載要操作的文件
$list = $dom->getElementsByTagName('event');//獲取event節(jié)點(diǎn)列表
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
再看一下現(xiàn)在的t.xml文件的內(nèi)容,count屬性已經(jīng)添加上。
<?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>
三、修改節(jié)點(diǎn)屬性&節(jié)點(diǎn)值
以上一節(jié)中的t.xml文件為操作對象,修改一下obj屬性是cpu的節(jié)點(diǎn)的count值,新的值為count+1 。
/*
* 修改某一個(gè)節(jié)點(diǎn)的屬性和值
*/
$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';//重置節(jié)點(diǎn)的值
}
}
$dom->save('./t.xml');
操作后的t.xml文件如下,要以看到obj=cpu的節(jié)點(diǎn)的count屬性已經(jīng)改變,值也修改成功。
<?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>
四、刪除節(jié)點(diǎn)
要添加就會(huì)有刪除。以上節(jié)的t.xml文件為操作對象,刪除obj=disk的節(jié)點(diǎn)。
/*
* 刪除節(jié)點(diǎn)
*/
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');
$list = $dom->getElementsByTagName('event');
foreach($list as $item){
if($item->getAttribute('obj') == 'disk'){//以obj=disk的節(jié)點(diǎn)為操作對象
$item->parentNode->removeChild($item);//刪除節(jié)點(diǎn)
}
}
$dom->save('./t.xml');
看一下操作后的t.xml文件內(nèi)容,obj=disk的節(jié)點(diǎn)已被成功刪除。
<?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>
向根節(jié)點(diǎn)中添加新的子節(jié)點(diǎn)
以上一節(jié)的t.xml為操作對象,向根節(jié)點(diǎn)EventList中添加一個(gè)新的子節(jié)點(diǎn)。
/*
* 向EventList中添加一個(gè)子節(jié)點(diǎn)
*/
$dom = new DOMDocument('1.0');
$dom->load('./t.xml');
$event_list = $dom->getElementsByTagName('EventList');//獲取根節(jié)點(diǎn)
$event = $dom->createElement('event','lenovo');//新建節(jié)點(diǎn)
$event_list->item(0)->appendChild($event);//將新建節(jié)點(diǎn)添加到根節(jié)點(diǎn)中
$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文件內(nèi)容,新的子節(jié)點(diǎn)已經(jīng)被插入到根節(jié)點(diǎn)中。
<?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>
五、關(guān)于item($index)
item(index)是DOMNodeList類中的一個(gè)方法,它的做用是返回一個(gè)由索引指明的節(jié)點(diǎn)。而DOMDocument類中的getElementsByTagName(name)方法返回的正是一個(gè)DOMNodeList對象的實(shí)例,所以可以直接調(diào)用item(index)方法。以上節(jié)的t.xml為示例,如果e=dom−>getElementsByTagName(‘EventList′)獲取EventList節(jié)點(diǎn)的信息,因?yàn)镋ventList節(jié)點(diǎn)是根節(jié)點(diǎn),有且僅有一個(gè),所以它調(diào)用item(index)時(shí),索引只有index=0可用,因?yàn)樗挥?個(gè);而如果e=dom−>getElementsByTagName(‘event′)獲取event節(jié)點(diǎn)的信息,因?yàn)閑vent有4個(gè),所以它調(diào)用item(index)時(shí),索引$index={0,1,2,3} ,有4個(gè)值可以選。每個(gè)節(jié)點(diǎn)都包含多個(gè)屬性,它可以以一種鍵值對數(shù)組的形式表現(xiàn)出來,如下所示:
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"
}
也可以當(dāng)做對象的屬性來用,例如獲取這個(gè)節(jié)點(diǎn)的值:
/*
* 關(guān)于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;
// }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用PHP能有所幫助,如果有疑問大家可以留言交流。
- 解析php DOMElement 操作xml 文檔的實(shí)現(xiàn)代碼
- 使用PHP DOM-XML創(chuàng)建和解析XML文件
- PHP基于DOMDocument解析和生成xml的方法分析
- PHP XML操作類DOMDocument
- php中DOMDocument簡單用法示例代碼(XML創(chuàng)建、添加、刪除、修改)
- DOM基礎(chǔ)及php讀取xml內(nèi)容操作的方法
- php中使用DOM類讀取XML文件的實(shí)現(xiàn)代碼
- PHP5中使用DOM控制XML實(shí)現(xiàn)代碼
- 用PHP讀取和編寫XML DOM的實(shí)現(xiàn)代碼
- 用PHP實(shí)現(xiàn)讀取和編寫XML DOM代碼
- PHP使用DOM對XML解析處理操作示例
相關(guān)文章
php self,$this,const,static,->的使用
用php這么久了,慚愧的是,原來自己還一直沒分清楚這幾個(gè)關(guān)鍵字使用方法。2009-10-10
關(guān)于Anemometer圖形化顯示MySQL慢日志的工具搭建及使用的詳細(xì)介紹
這篇文章主要介紹了關(guān)于Anemometer圖形化顯示MySQL慢日志的工具搭建及使用的詳細(xì)介紹,Anemometer 是一個(gè)圖形化顯示MySQL慢日志的工具,Anemometer可以很輕松的幫你去分析慢查詢?nèi)罩?,讓你很容易就能找到哪些SQL需要優(yōu)化。感興趣可以來了解一下2020-07-07
PHP服務(wù)器頁面間跳轉(zhuǎn)實(shí)現(xiàn)方法
在ASP中,我們可以使用Server.Transfer來實(shí)現(xiàn)在服務(wù)器端重定向,PHP中雖然沒有這樣的函數(shù),但是要實(shí)現(xiàn)類似的跳轉(zhuǎn)也不難2012-08-08
php獲取json數(shù)據(jù)所有的節(jié)點(diǎn)路徑
這篇文章主要介紹了php獲取json數(shù)據(jù)所有的節(jié)點(diǎn)路徑的方法和實(shí)例,有需要的小伙伴可以參考下。2015-05-05
本地機(jī)apache配置基于域名的虛擬主機(jī)詳解
以下是對本地機(jī)apache配置基于域名的虛擬主機(jī)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-08-08
PHP生成不同顏色、不同大小的tag標(biāo)簽函數(shù)
看別人網(wǎng)站上面的tag都是不同顏色,不同大小的tag標(biāo)簽非常不錯(cuò),這里就分享兩個(gè)函數(shù),方便需要的朋友2013-09-09

