PHP - SAX 解析器示例



PHP 在 php.ini 設定檔案中預設啟用了 XML 解析器擴充套件。此解析器實現 SAX API,這是一種基於事件的解析演算法。

基於事件的解析器不會將整個 XML 文件載入到記憶體中。相反,它一次讀取一個節點。解析器允許您即時互動。一旦您移至下一個節點,舊節點就會從記憶體中移除。

基於 SAX 的解析機制比基於樹的解析器更快。PHP 庫包含處理 XML 事件的函式,如本章所述。

解析 XML 文件的第一步是使用 xml_parse_create() 函式建立一個解析器物件。

xml_parser_create(?string $encoding = null): XMLParser

此函式建立一個新的 XML 解析器並返回一個 XMLParser 物件,供其他 XML 函式使用。

xml_parse() 函式開始解析 XML 文件。

xml_parse(XMLParser $parser, string $data, bool $is_final = false): int

xml_parse() 解析 XML 文件。配置事件的處理程式會根據需要呼叫多次。

XMLParser 擴充套件提供了不同的事件處理程式函式。

xml_set_element_handler()

此函式為 XML 解析器設定元素處理程式函式。每當 XML 解析器遇到開始或結束標記時,都會發出元素事件。開始標記和結束標記有單獨的處理程式。

xml_set_element_handler(XMLParser $parser, callable $start_handler, 
   callable $end_handler): true

當開啟新的 XML 元素時,會呼叫 start_handler() 函式。當關閉 XML 元素時,會呼叫 end_handler() 函式。

xml_set_character_data_handler()

此函式為 XML 解析器設定字元資料處理程式函式。字元資料大致是 XML 文件的所有非標記內容,包括標記之間的空白字元。

xml_set_character_data_handler(XMLParser $parser, callable $handler): true

xml_set_processing_instruction_handler()

此函式為 XML 解析器設定處理指令 (PI) 處理程式函式。<?php ?> 是一個處理指令,其中 php 被稱為“PI 目標”。這些的處理是特定於應用程式的。

xml_set_processing_instruction_handler(XMLParser $parser, callable $handler): true

一個處理指令具有以下格式:

<?target
   data
?>

xml_set_default_handler()

此函式為 XML 解析器設定預設處理程式函式。不屬於其他處理程式的內容將轉到預設處理程式。您將在預設處理程式中獲得 XML 和文件型別宣告等內容。

xml_set_default_handler(XMLParser $parser, callable $handler): true

示例

以下示例演示瞭如何使用 SAX API 解析 XML 文件。我們將使用 SAX.xml 如下所示:

<?xml version = "1.0" encoding = "utf-8"?>
<tutors>
   <course>
      <name>Android</name>
      <country>India</country>
      <email>contact@tutorialspoint.com</email>
      <phone>123456789</phone>
   </course>

   <course>
      <name>Java</name>
      <country>India</country>
      <email>contact@tutorialspoint.com</email>
      <phone>123456789</phone>
   </course>

   <course>
      <name>HTML</name>
      <country>India</country>
      <email>contact@tutorialspoint.com</email>
      <phone>123456789</phone>
   </course>
</tutors>

示例

解析上述文件的 PHP 程式碼如下所示。它開啟 XML 檔案並呼叫 xml_parse() 函式,直到到達其檔案末尾。事件處理程式將資料儲存在 tutors 陣列中。然後按元素逐個輸出陣列。

<?php

   // Reading XML using the SAX(Simple API for XML) parser 
   $tutors   = array();
   $elements   = null;

   // Called to this function when tags are opened 
   function startElements($parser, $name, $attrs) {
      global $tutors, $elements;
      if(!empty($name)) {
         if ($name == 'COURSE') {
		 
            // creating an array to store information
            $tutors []= array();
         }
         $elements = $name;
      }
   }

   // Called to this function when tags are closed 
   function endElements($parser, $name) {
      global $elements;

      if(!empty($name)) {
         $elements = null;
      }
   }

   // Called on the text between the start and end of the tags
   function characterData($parser, $data) {
      global $tutors, $elements;
      if(!empty($data)) {
         if ($elements == 'NAME' || $elements == 'COUNTRY' ||  $elements == 'EMAIL' ||  $elements == 'PHONE') {
            $tutors[count($tutors)-1][$elements] = trim($data);
         }
      }
   }

   $parser = xml_parser_create();
   xml_set_element_handler($parser, "startElements", "endElements");
   xml_set_character_data_handler($parser, "characterData");

   // open xml file
   if (!($handle = fopen('sax.xml', "r"))) {
      die("could not open XML input");
   }

   while($data = fread($handle, 4096)) {
      xml_parse($parser, $data);  
   }

   xml_parser_free($parser); 
   $i = 1;

   foreach($tutors as $course) {
      echo "course No - ".$i. '<br/>';
      echo "course Name - ".$course['NAME'].'<br/>';
      echo "Country - ".$course['COUNTRY'].'<br/>';
      echo "Email - ".$course['EMAIL'].'<br/>';
      echo "Phone - ".$course['PHONE'].'<hr/>'; 
      $i++; 
   }
?>

以上程式碼給出以下輸出:

course No - 1
course Name - Android
Country - India
Email - contact@tutorialspoint.com
Phone - 123456789
________________________________________
course No - 2
course Name - Java
Country - India
Email - contact@tutorialspoint.com
Phone - 123456789
________________________________________
course No - 3
course Name - HTML
Country - India
Email - contact@tutorialspoint.com
Phone - 123456789
________________________________________
廣告