對於操作XML型別檔案,PHP內建有一套DOM物件可以進行處理。對XML的操作,從建立、新增到修改、刪除都可以使用DOM物件中的函式來進行。
建立
建立一個新的XML檔案,並且寫入一些資料到這個XML檔案中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* * 建立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,可以看一下它的內容。
1 2 3 4 5 6 7 |
<?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資訊&新增新的屬性
以上一節建立的t.xml檔案為操作物件,讀取出t.xml檔案中的資訊,並給節點新增一個新的屬性count,其值為1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * 讀取xml檔案資訊,並新增新的屬性 */ $dom = new DOMDocument('1.0'); $dom->load('./t.xml');//載入要操作的檔案 $list = $dom->getElementsByTagName('event');//獲取event節點列表 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');//儲存修改 |
看一下提取到的值:
1 2 3 4 5 6 7 |
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 |
再看一下現在的t.xml檔案的內容,count屬性已經新增上。
1 2 3 4 5 6 7 |
<?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> |
修改節點屬性&節點值
以上一節中的t.xml檔案為操作物件,修改一下obj屬性是cpu的節點的count值,新的值為count+1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* * 修改某一個節點的屬性和值 */ $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';//重置節點的值 } } $dom->save('./t.xml'); |
操作後的t.xml檔案如下,要以看到obj=cpu的節點的count屬性已經改變,值也修改成功。
1 2 3 4 5 6 7 |
<?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> |
刪除節點
要新增就會有刪除。以上節的t.xml檔案為操作物件,刪除obj=disk的節點。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* * 刪除節點 */ $dom = new DOMDocument('1.0'); $dom->load('./t.xml'); $list = $dom->getElementsByTagName('event'); foreach($list as $item){ if($item->getAttribute('obj') == 'disk'){//以obj=disk的節點為操作物件 $item->parentNode->removeChild($item);//刪除節點 } } $dom->save('./t.xml'); |
看一下操作後的t.xml檔案內容,obj=disk的節點已被成功刪除。
1 2 3 4 5 6 7 |
<?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> |
向根節點中新增新的子節點
以上一節的t.xml為操作物件,向根節點EventList中新增一個新的子節點。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * 向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檔案內容,新的子節點已經被插入到根節點中。
1 2 3 4 5 6 7 |
<?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> |
關於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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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" } |
也可以當做物件的屬性來用,例如獲取這個節點的值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * 關於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; // } |