PHP 原生 DOM 對象操作 XML

來源:互聯網
上載者:User
對於操作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,可以看一下它的內容。

<?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。

/** 讀取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');//儲存修改

看一下提取到的值:

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屬性已經添加上。

<?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。

/** 修改某一個節點的屬性和值*/ $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屬性已經改變,值也修改成功。

<?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的節點。

/** 刪除節點*/ $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的節點已被成功刪除。

<?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中添加一個新的子節點。

/** 向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檔案內容,新的子節點已經被插入到根節點中。

<?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個值可以選。每個節點都包含多個屬性,它可以以一種索引值對數組的形式表現出來,如下所示:

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;// }

以上就是PHP 原生 DOM 對象操作 XML的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.