PHP使用DOMDocument 操作xml

时间:2022-10-20 19:14:02
  1 <?php
  2 class xmlMessage{
  3     protected $doc;
  4     protected $rootKey;//根节点
  5     public $xmlName;//xml文件名
  6 
  7     /*
  8     xmlMessage类构造函数
  9     @param string xmlName
 10     */
 11     public function  __construct($xmlName,$rootKey) {
 12         
 13         $this->xmlName=$xmlName;
 14         $this->rootKey = $rootKey;
 15         
 16         if(!file_exists($this->xmlName))
 17          {
 18             $this->doc = new DOMDocument('1.0', 'utf-8');
 19             $rootKey = $this->doc->createElement($this->rootKey);//create root key
 20             $this->rootKey = $this->doc->appendChild($rootKey);
 21             $this->doc->save($this->xmlName);
 22          }else
 23          {
 24             $this->doc = new DOMDocument();            
 25             $this->doc->load($xmlName);
 26 
 27          }
 28          
 29             $this->doc->formatOutput = true;
 30     
 31         }
 32     
 33 
 34     /*
 35      创建子节点
 36      @param $childNode :要创建的子节点及属性$child_attr_array=null;    
 37      @param $parentNode:要创建的子节点的父节点及属性 $parent_attr_array=null;
 38     */
 39     public function createChildNode($childNode,$child_attr_array=null,$parentNode,$parent_attr_array=null)
 40     {
 41         $cnode = $this->doc->createElement($childNode);
 42 
 43         //获取要添加的子节点的父节点
 44         if($parent_attr_array!=null){
 45             foreach($parent_attr_array as $attr_key=>$attr_value)
 46             {
 47                 $cnode = $this->getNodeByAttr($parentNode,$attr_key,$attr_value)->appendChild($cnode);
 48             }
 49         }else
 50         {        //避免创建父节点即:在父节点下创建子节点    
 51                 $cnode = $this->doc->getElementsByTagName($parentNode)->item(0)->appendChild($cnode);
 52         }
 53 
 54         
 55            //设置子节点值
 56         //$cnode->nodeValue=$chileNodeValue;
 57 
 58         //设置属性
 59         if($child_attr_array!=null)
 60         {
 61             foreach($child_attr_array as $attr_key=>$attr_value)
 62             {
 63                 $cnode->setAttribute($attr_key,$attr_value);
 64             }
 65         }
 66 
 67 
 68 
 69     }
 70 
 71     /*
 72       获取具有某属性的节点
 73       @param 节点名$nodeName,及其属性和值$attrName,$attrValue
 74       @return DOMNode 
 75     */
 76     public function getNodeByAttr($nodeName,$attrName,$attrValue)
 77     {
 78         $nodeList = $this->doc->getElementsByTagName($nodeName);
 79 
 80         for($i=0; $i<$nodeList->length;$i++)
 81         {
 82             $attrList = $nodeList->item($i)->getAttributeNode($attrName);
 83             if($attrList->value == $attrValue)
 84             {
 85                 return $nodeList->item($i);
 86                 
 87                 //echo 'okkkkkk'.'<br>';;
 88             }
 89        
 90         }
 91         
 92     }
 93     
 94 
 95     //删除具有某个属性的节点
 96     public function delete_Node($nodeName,$attrName,$attrValue)
 97     {
 98         try
 99         {
100            $delete_Node = $this->getNodeByAttr($nodeName,$attrName,$attrValue);
101            $delete_Node->parentNode->removeChild($delete_Node);
102 
103         }catch(DOMException $e)
104         {
105             echo 'fail!';
106         }
107     }
108 
109 
110     //创建节点属性
111     public function createNodeAttribute($nodeName,$attr,$aValue)
112     {
113          $nodes = $this->doc->getElementsByTagName($nodeName);
114           for($i=0; $i<$nodes->length;$i++)
115         {
116           $nodeValue = $nodes->item($i)->nodeValue.'<br>';
117         }
118         
119         //$node->item[0]->setAttribute($attr,$aValue);
120 
121     }
122 
123     /*
124      保存xml
125     */
126     public function saveXml()
127         {
128            
129            $this->doc->save($this -> xmlName);
130         }
131 
132 
133 
134    
135 
136 }
137 
138 //实例操作
139   $myXml = new xmlMessage("opera.xml","世界");//创建一个以"世界"为根节点的xml文件
140  
141   $myXml->createChildNode("国家",array('name'=>'中国','人口'=>'1亿'),'世界');
142 
143   $myXml->createChildNode("国家",array('name'=>'英国','人口'=>'50millon'),'世界');
144 
145   $myXml->createChildNode("山东",array('city'=>'济南','note'=>'省会'),'国家',array('name'=>'英国'));
146   $myXml->createChildNode("浙江",'','国家',array('name'=>'英国'));
147 
148   //$myXml->createChildNode("历城",array('city'=>'济南','note'=>'区'),'山东');
149 
150 
151   //$myXml->createNodeAttribute("国家","人口",125);
152 
153   //$myXml->getNodeByAttr("国家",'name','英国');
154   //$myXml->delete_Node("历城",'city','济南');
155 
156 
157   $myXml->saveXml();
158 
159 ?>