PHP-SAX 파서 예제

SAX 파서는 xml 파일을 구문 분석하는 데 사용되었으며 샘플 xml 파서 및 DOM보다 메모리 관리에 더 좋습니다. 메모리에 데이터를 보관하지 않으므로 매우 큰 파일에 사용할 수 있습니다. 다음 예제는 SAX API를 사용하여 xml에서 데이터를 가져 오는 방법을 보여줍니다.

SAX.xml

XML은 다음과 같아야합니다-

<?xml version = "1.0" encoding = "utf-8"?>
<tutors>
   <course>
      <name>Android</name>
      <country>India</country>
      <email>[email protected]</email>
      <phone>123456789</phone>
   </course>
   
   <course>
      <name>Java</name>
      <country>India</country>
      <email>[email protected]</email>
      <phone>123456789</phone>
   </course>
   
   <course>
      <name>HTML</name>
      <country>India</country>
      <email>[email protected]</email>
      <phone>123456789</phone>
   </course>
</tutors>

SAX.php

PHP 파일은 다음과 같아야합니다-

<?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);
         }
      }
   }
   
   // Creates a new XML parser and returns a resource handle referencing it to be used by the other XML functions. 
   $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)) // read xml file {
      xml_parse($parser, $data);  // start parsing an xml document 
   }
   
   xml_parser_free($parser); // deletes the 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++; 
   }
?>

다음 결과가 생성됩니다-