PHP使用DOM XML操作XML[总结]
1、前言
XML树状层次结构鲜明,非常适合作为配置文件。PHP中可以使用DOM XML来操作XML。本文总结一下PHP使用DOM XML创建、添加节点、查询XML文件。
2、使用DOM XML
XML中节点分为元素和文本,DOMDocument类型是文档类型,提供了操作元素和文本的成员函数和属性。
DOMDocument类如下:
DOMDocument extends DOMNode { /* Properties */ readonly public string $actualEncoding ; readonly public DOMConfiguration $config ; readonly public DOMDocumentType $doctype ; readonly public DOMElement $documentElement ; public string $documentURI ; public string $encoding ; public bool $formatOutput ; readonly public DOMImplementation $implementation ; public bool $preserveWhiteSpace =true ; public bool $recover ; public bool $resolveExternals ; public bool $standalone ; public bool $strictErrorChecking =true ; public bool $substituteEntities ; public bool $validateOnParse =false ; public string $version ; readonly public string $xmlEncoding ; public bool $xmlStandalone ; public string $xmlVersion ; /* Methods */ __construct ([ string $version [, string $encoding ]] ) DOMAttr createAttribute ( string $name ) DOMAttr createAttributeNS ( string $namespaceURI , string $qualifiedName ) DOMCDATASection createCDATASection ( string $data ) DOMComment createComment ( string $data ) DOMDocumentFragment createDocumentFragment ( void ) DOMElement createElement ( string $name [, string $value ] ) DOMElement createElementNS ( string $namespaceURI , string $qualifiedName [, string $value ] ) DOMEntityReference createEntityReference ( string $name ) DOMProcessingInstruction createProcessingInstruction ( string $target [, string $data ] ) DOMText createTextNode ( string $content ) DOMElement getElementById ( string $elementId ) DOMNodeList getElementsByTagName ( string $name ) DOMNodeList getElementsByTagNameNS ( string $namespaceURI , string $localName ) DOMNode importNode ( DOMNode $importedNode [, bool $deep ] ) mixed load ( string $filename [, int $options=0 ] ) bool loadHTML ( string $source ) bool loadHTMLFile ( string $filename ) mixed loadXML ( string $source [, int $options=0 ] ) void normalizeDocument ( void ) bool registerNodeClass ( string $baseclass , string $extendedclass ) bool relaxNGValidate ( string $filename ) bool relaxNGValidateSource ( string $source ) int save ( string $filename [, int $options ] ) string saveHTML ( void ) int saveHTMLFile ( string $filename ) string saveXML ([ DOMNode $node [, int $options ]] ) bool schemaValidate ( string $filename ) bool schemaValidateSource ( string $source ) bool validate ( void ) int xinclude ([ int $options ] ) /* Inherited methods */ DOMNode DOMNode::appendChild ( DOMNode $newnode ) DOMNode DOMNode::cloneNode ([ bool $deep ] ) bool DOMNode::hasAttributes ( void ) bool DOMNode::hasChildNodes ( void ) DOMNode DOMNode::insertBefore ( DOMNode $newnode [, DOMNode $refnode ] ) bool DOMNode::isDefaultNamespace ( string $namespaceURI ) bool DOMNode::isSameNode ( DOMNode $node ) bool DOMNode::isSupported ( string $feature , string $version ) string DOMNode::lookupNamespaceURI ( string $prefix ) string DOMNode::lookupPrefix ( string $namespaceURI ) void DOMNode::normalize ( void ) DOMNode DOMNode::removeChild ( DOMNode $oldnode ) DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode ) }
元素节点类DOMElement类型定义如下:
1 DOMElement extends DOMNode { 2 /* Properties */ 3 readonly public bool $schemaTypeInfo ; 4 readonly public string $tagName ; 5 /* Methods */ 6 __construct ( string $name [, string $value [, string $namespaceURI ]] ) 7 string getAttribute ( string $name ) 8 DOMAttr getAttributeNode ( string $name ) 9 DOMAttr getAttributeNodeNS ( string $namespaceURI , string $localName ) 10 string getAttributeNS ( string $namespaceURI , string $localName ) 11 DOMNodeList getElementsByTagName ( string $name ) 12 DOMNodeList getElementsByTagNameNS ( string $namespaceURI , string $localName ) 13 bool hasAttribute ( string $name ) 14 bool hasAttributeNS ( string $namespaceURI , string $localName ) 15 bool removeAttribute ( string $name ) 16 bool removeAttributeNode ( DOMAttr $oldnode ) 17 bool removeAttributeNS ( string $namespaceURI , string $localName ) 18 DOMAttr setAttribute ( string $name , string $value ) 19 DOMAttr setAttributeNode ( DOMAttr $attr ) 20 DOMAttr setAttributeNodeNS ( DOMAttr $attr ) 21 void setAttributeNS ( string $namespaceURI , string $qualifiedName , string $value ) 22 void setIdAttribute ( string $name , bool $isId ) 23 void setIdAttributeNode ( DOMAttr $attr , bool $isId ) 24 void setIdAttributeNS ( string $namespaceURI , string $localName , bool $isId ) 25 /* Inherited methods */ 26 DOMNode DOMNode::appendChild ( DOMNode $newnode ) 27 DOMNode DOMNode::cloneNode ([ bool $deep ] ) 28 bool DOMNode::hasAttributes ( void ) 29 bool DOMNode::hasChildNodes ( void ) 30 DOMNode DOMNode::insertBefore ( DOMNode $newnode [, DOMNode $refnode ] ) 31 bool DOMNode::isDefaultNamespace ( string $namespaceURI ) 32 bool DOMNode::isSameNode ( DOMNode $node ) 33 bool DOMNode::isSupported ( string $feature , string $version ) 34 string DOMNode::lookupNamespaceURI ( string $prefix ) 35 string DOMNode::lookupPrefix ( string $namespaceURI ) 36 void DOMNode::normalize ( void ) 37 DOMNode DOMNode::removeChild ( DOMNode $oldnode ) 38 DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode ) 39 }
文本类型DOMText定义如下:
DOMText extends DOMCharacterData { /* Properties */ readonly public string $wholeText ; /* Methods */ __construct ([ string $value ] ) bool isWhitespaceInElementContent ( void ) DOMText splitText ( int $offset ) /* Inherited methods */ void DOMCharacterData::appendData ( string $data ) void DOMCharacterData::deleteData ( int $offset , int $count ) void DOMCharacterData::insertData ( int $offset , string $data ) void DOMCharacterData::replaceData ( int $offset , int $count , string $data ) string DOMCharacterData::substringData ( int $offset , int $count ) }
DOMNode节点定义如下:
DOMNode { /* Properties */ public readonly string $nodeName ; public string $nodeValue ; public readonly int $nodeType ; public readonly DOMNode $parentNode ; public readonly DOMNodeList $childNodes ; public readonly DOMNode $firstChild ; public readonly DOMNode $lastChild ; public readonly DOMNode $previousSibling ; public readonly DOMNode $nextSibling ; public readonly DOMNamedNodeMap $attributes ; public readonly DOMDocument $ownerDocument ; public readonly string $namespaceURI ; public string $prefix ; public readonly string $localName ; public readonly string $baseURI ; public string $textContent ; /* Methods */ DOMNode appendChild ( DOMNode $newnode ) DOMNode cloneNode ([ bool $deep ] ) bool hasAttributes ( void ) bool hasChildNodes ( void ) DOMNode insertBefore ( DOMNode $newnode [, DOMNode $refnode ] ) bool isDefaultNamespace ( string $namespaceURI ) bool isSameNode ( DOMNode $node ) bool isSupported ( string $feature , string $version ) string lookupNamespaceURI ( string $prefix ) string lookupPrefix ( string $namespaceURI ) void normalize ( void ) DOMNode removeChild ( DOMNode $oldnode ) DOMNode replaceChild ( DOMNode $newnode , DOMNode $oldnode ) }
3、测试程序
1 <?php 2 3 const INDEX_FILE_NAME = "student_file_index.xml"; 4 5 //文件索引类 6 class file_index 7 { 8 public function set_file_index($file_name, $cur_count, $total_count) 9 { 10 $this->file_name = $file_name; 11 $this->cur_count = $cur_count; 12 $this->total_count = $total_count; 13 } 14 public function get_file_name() 15 { 16 return $this->file_name; 17 } 18 public function get_cur_count() 19 { 20 return $this->cur_count; 21 } 22 public function get_total_count() 23 { 24 return $this->total_count; 25 } 26 27 private $file_name; //文件名 28 private $cur_count; //当前记录数 29 private $total_count; //总记录数 30 } 31 32 function create_file_index(array $params) 33 { 34 $index = new file_index(); 35 $index->set_file_index($params['file_name'], 36 $params['cur_count'], $params['total_count']); 37 return $index; 38 } 39 40 function create_file_node(DOMDocument $doc, file_index $index) 41 { 42 //创建一个file元素 43 $file = $doc->createElement("file"); 44 //创建一个属性元素 45 $name_attr = $doc->createAttribute("name"); 46 //将该属性添加到file元素上 47 $file->appendChild($name_attr); 48 49 //创建一个文本元素 50 $file_name = $doc->createTextNode($index->get_file_name()); 51 //将文本元素添加name_attr属性上 52 $name_attr->appendChild($file_name); 53 54 //创建一个cur_count元素 55 $cur_count = $doc->createElement("cur_count", strval($index->get_cur_count())); 56 //将cur_count添加到file元素下 57 $cur_count = $file->appendChild($cur_count); 58 59 //创建一个total_count元素 60 $total_count = $doc->createElement("total_count", 61 strval($index->get_total_count())); 62 //将total_count添加到file元素下 63 $total_count = $file->appendChild($total_count); 64 65 return $file; 66 } 67 68 function create_index_file($index_file_name, array $params) 69 { 70 //创建一个文档 71 $doc = new DOMDocument("1.0", "utf-8"); 72 //创建根元素 73 $root = $doc->createElement("index"); 74 $root = $doc->appendChild($root); 75 76 //创建一个索引结构 77 $index = create_file_index($params); 78 $file = create_file_node($doc, $index); 79 80 //将file看到根元素下 81 $root->appendChild($file); 82 $doc->save($index_file_name); 83 return true; 84 } 85 86 function add_index_file($index_file_name, array $params) 87 { 88 //创建一个文档 89 $doc = new DOMDocument(); 90 //加载xml文件 91 $doc->load($index_file_name); 92 //获取index元素列表 93 $node_list = $doc->getElementsByTagName('index'); 94 //获取根元素 95 $root = $node_list->item(0); 96 //创建一个索引结构 97 $index = create_file_index($params); 98 $file = create_file_node($doc, $index); 99 //将file看到根元素下 100 $root->appendChild($file); 101 $doc->save($index_file_name); 102 } 103 104 function traverse_file_index($index_file_name) 105 { 106 $file_index = array(); 107 $doc = new DOMDocument(); 108 $doc->load($index_file_name); 109 //获取file元素集合 110 $file_list = $doc->getElementsByTagName('file'); 111 //获取cur_count元素集合 112 $cur_count_list = $doc->getElementsByTagName('cur_count'); 113 //获取total_count元素集合 114 $total_count_list = $doc->getElementsByTagName('total_count'); 115 for ($i = 0; $i < $file_list->length; $i++) { 116 $index = new file_index(); 117 //获取file元素的name属性值 118 $file_name = $file_list->item($i)->attributes->getNamedItem("name")->nodeValue; 119 $index->set_file_index($file_name, $cur_count_list->item($i)->nodeValue, 120 $total_count_list->item($i)->nodeValue); 121 $file_index[$i] = $index; 122 } 123 124 return $file_index; 125 } 126 127 /*****************for test*********************/ 128 $params = array(); 129 $index_file_name = INDEX_FILE_NAME; 130 131 if (file_exists($index_file_name)) { 132 $params['file_name'] = "student_info_2014_02_12"; 133 $params['cur_count'] = 10; 134 $params['total_count'] = 10; 135 echo "Add index to file.\n"; 136 add_index_file($index_file_name, $params); 137 } 138 else { 139 $params['file_name'] = "student_info_2014_02_11"; 140 $params['cur_count'] = 23; 141 $params['total_count'] = 33; 142 echo "Create index file.\n"; 143 create_index_file($index_file_name, $params); 144 } 145 146 //测试读取xm文件 147 echo "Read index content from ".$index_file_name."\n"; 148 echo "file_name\t\t\tcur_count\ttotal_count.\n"; 149 $file_index = traverse_file_index($index_file_name); 150 foreach($file_index as $index) { 151 echo $index->get_file_name(); 152 echo "\t\t "; 153 echo $index->get_cur_count(); 154 echo strval($cur_count); 155 echo "\t\t "; 156 echo $index->get_total_count(); 157 echo "\n"; 158 }
测试结果如下图所示:
冷静思考,勇敢面对,把握未来!