zoukankan      html  css  js  c++  java
  • 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.
    ";
    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.
    ";
    143   create_index_file($index_file_name, $params);
    144 }
    145 
    146 //测试读取xm文件
    147 echo "Read index content from ".$index_file_name."
    ";
    148 echo "file_name			cur_count	total_count.
    ";
    149 $file_index = traverse_file_index($index_file_name);
    150 foreach($file_index as $index) {
    151   echo $index->get_file_name();
    152   echo "		  ";
    153   echo $index->get_cur_count();
    154   echo strval($cur_count);
    155   echo "		  ";
    156   echo $index->get_total_count();
    157   echo "
    ";
    158 }

    测试结果如下图所示:

  • 相关阅读:
    c++开发之对应Linux下的sem_t和lock
    嵌入式开发之davinci--- 8148/8168/8127 中的图像处理算法优化库vlib
    crc32 冗余加密校验
    快速安装 GitLab 并汉化
    oracle-6-密码文件
    oracle-5-的升级步骤
    Linux大文件已删除,但df查看已使用的空间并未减少解决
    cygwin 的不同文件类型显示不同的颜色
    PLSQL的安装
    网络流量监控工具----iftop
  • 原文地址:https://www.cnblogs.com/Anker/p/3550166.html
Copyright © 2011-2022 走看看