熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

使用PHP 5.0 輕松解析XML文檔(1)

2013-11-15 12:22:09  來源: PHP編程 

  用sax方式的時候要自己構建個函數而且要直接用這三的函數來返回數據 要求較強的邏輯 在處理不同結構的xml的時候 還要重新進行構造這三個函數麻煩!
  
  用dom方式倒是好些但是他把每個節點都看作是一個node操作起來要寫好多的代碼 麻煩!
  
  網上有好多的開源的xml解析的類庫 以前看過幾個但是心裡總是覺得不踏實感覺總是跟在別人的屁股後面
  
  這幾天在搞java 挺累的所以決定換換腦袋寫點php代碼為了防止以後xml解析過程再令我犯難就花了一天的時間寫了下面一個xml解析的類於是就有了下面的東西
  
  實現方式是通過包裝sax方式的解析結果來實現的 總的來說對於我個人來說挺實用的性能也還可以基本上可以完成大多數的處理要求
  
  功能:
   對基本的xml文件的節點進行 查詢 / 添加 / 修改 / 刪除 工作
  
  導出xml文件的所有數據到一個數組裡面
  
  整個設計采用了oo方式在操作結果集的時候 使用方法類似於dom
  
  缺點:
   每個節點最好都帶有一個id(看後面的例子) 每個節點名字=節點的標簽_節點的id如果這個id值沒有設置程序將自動給他產生一個id這個id就是這個節點在他的上級節點中的位置編號開始
  
   查詢某個節點的時候可以通過用|符號連接節點名字來進行這些節點名字都是按順序寫好的上級節點的名字
  
  使用說明
  運行下面的例子在執行結果頁面上可以看到函數的使用說明
  
  代碼是通過php來實現的在php中無法正常運行
  
  由於剛剛寫完所以沒有整理文檔下面的例子演示的只是一部分的功能代碼不是很難要是想知道更多的功能可以研究研究源代碼
  
  目錄結構:
     testphp
     testxml
     xml / SimpleDocumentBasephp
     xml / SimpleDocumentNodephp
     xml / SimpleDocumentRootphp
     xml / SimpleDocumentParserphp
  
    文件:testxml
  
  <?xml version= encoding=GB?><shop> <name>華聯</name> <address>北京長安街-號</address> <desc>連鎖超市</desc> <cat id=food> <goods id=food>  <name>food</name>  <price></price> </goods> <goods id=food>  <name>food</name>  <price></price>  <desc creator=hahawen>好東西推薦</desc> </goods> </cat> <cat> <goods id=tel>  <name>tel</name>  <price></price> </goods> </cat> <cat id=coat> <goods id=coat>  <name>coat</name>  <price></price> </goods> <goods id=coat>  <name>coat</name>  <price></price> </goods> </cat> <special id=hot> <goods>  <name>hot</name>  <price></price> </goods> </special></shop>
  
     文件:testphp
  
   <?php
    require_once xml/SimpleDocumentParserphp;  require_once xml/SimpleDocumentBasephp;  require_once xml/SimpleDocumentRootphp;  require_once xml/SimpleDocumentNodephp;  $test = new SimpleDocumentParser();  $test>parse(testxml);  $dom = $test>getSimpleDocument();  echo <pre>;  echo <hr><font color=red>;  echo 下面是通過函數getSaveData()返回的整個xml數據的數組;  echo </font><hr>;  print_r($dom>getSaveData());  echo <hr><font color=red>;  echo 下面是通過setValue()函數給給根節點添加信息添加後顯示出結果xml文件的內容;  echo </font><hr>;  $dom>setValue(telphone );  echo htmlspecialchars($dom>getSaveXml());  echo <hr><font color=red>;  echo 下面是通過getNode()函數返回某一個分類下的所有商品的信息;  echo </font><hr>;  $obj = $dom>getNode(cat_food);  $nodeList = $obj>getNode();  foreach($nodeList as $node){  $data = $node>getValue();  echo <font color=red>商品名$data[name]</font><br>;  print_R($data);  print_R($node>getAttribute());  }  echo <hr><font color=red>;  echo 下面是通過findNodeByPath()函數返回某一商品的信息;  echo </font><hr>;  $obj = $dom>findNodeByPath(cat_food|goods_food);  if(!is_object($obj)){  echo 該商品不存在;  }else{  $data = $obj>getValue();  echo <font color=red>商品名$data[name]</font><br>;  print_R($data);  print_R($obj>getAttribute());  }  echo <hr><font color=red>;  echo 下面是通過setValue()函數給商品\food\添加屬性 然後顯示添加後的結果;  echo </font><hr>;  $obj = $dom>findNodeByPath(cat_food|goods_food);  $obj>setValue(leaveword array(value=>這個商品不錯     attrs=>array(author=>hahawen date=>date(Ymd))));  echo htmlspecialchars($dom>getSaveXml());  echo <hr><font color=red>;  echo 下面是通過removeValue()/removeAttribute()函數     給商品\food\改變和刪除屬性 然後顯示操作後的結果;  echo </font><hr>;  $obj = $dom>findNodeByPath(cat_food|goods_food);  $obj>setValue(name new food);  $obj>removeValue(desc);  echo htmlspecialchars($dom>getSaveXml());  echo <hr><font color=red>;  echo 下面是通過createNode()函數添加商品 然後顯示添加後的結果;  echo </font><hr>;  $obj = $dom>findNodeByPath(cat_food);  $newObj = $obj>createNode(goods array(id=>food));  $newObj>setValue(name food);  $newObj>setValue(price );  echo htmlspecialchars($dom>getSaveXml());  echo <hr><font color=red>;  echo 下面是通過removeNode()函數刪除商品 然後顯示刪除後的結果;  echo </font><hr>;  $obj = $dom>findNodeByPath(cat_food);  $obj>removeNode(goods_food);  echo htmlspecialchars($dom>getSaveXml()); ?>
  
  文件:SimpleDocumentParserphp
  
  
  <?php
  /**
   *=========================================================
   *
   * @author   hahawen(大齡青年)
   * @since   
   * @copyright Copyright (c) NxCoder Group
   *
   *=========================================================
   */
  /**
   * class SimpleDocumentParser
   * use SAX parse xml file and build SimpleDocumentObject
   * all this pachages is work for xml file and method is action as DOM
   *
   * @package monxml
   * @version
   */
  class SimpleDocumentParser
  {
   private $domRootObject = null;
   private $currentNO = null;
   private $currentName = null;
   private $currentValue = null;
   private $currentAttribute = null;
   public function getSimpleDocument()
   {
     return $this>domRootObject;
   }
   public function parse($file)
   {
      $xmlParser = xml_parser_create();
     xml_parser_set_option($xmlParserXML_OPTION_CASE_FOLDING );
     xml_parser_set_option($xmlParserXML_OPTION_SKIP_WHITE );
     xml_parser_set_option($xmlParser XML_OPTION_TARGET_ENCODING UTF);
     xml_set_object($xmlParser $this);
     xml_set_element_handler($xmlParser startElement endElement);
     xml_set_character_data_handler($xmlParser characterData);
      if (!xml_parse($xmlParser file_get_contents($file)))
        die(sprintf(XML error: %s at line %d xml_error_string(xml_get_error_code($xmlParser))        xml_get_current_line_number($xmlParser)));
     xml_parser_free($xmlParser);
   }
   private function startElement($parser $name $attrs)
   {
      $this>currentName = $name;
      $this>currentAttribute = $attrs;
      if($this>currentNO == null)
      {
       $this>domRootObject = new SimpleDocumentRoot($name);
       $this>currentNO = $this>domRootObject;
      }
      else
      {
       $this>currentNO = $this>currentNO>createNode($name $attrs);
      }
   }
    private function endElement($parser $name)
From:http://tw.wingwit.com/Article/program/PHP/201311/20825.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.