PHP原生DOMオブジェクトのXML操作方法について詳しく説明してください。

10156 ワード

一、作成
新しい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しか利用できない。一方、e=dom−>getElementsByTagName(‘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の使用に役に立ちます。もし疑問があれば、メッセージを残して交流してください。