PHP/XML/SAX

Материал из Web эксперт
Перейти к: навигация, поиск

A simple XML parser

   <source lang="html4strict">

<?php $file = "contact.xml";

function startElement($parser, $name, $attrs) {

   print "$name =>  ";

} function endElement($parser, $name) {

   print "\n";

}

function characterData($parser, $value) {

   print "$value
";

}

$simpleparser = xml_parser_create(); xml_set_element_handler($simpleparser, "startElement", "endElement"); xml_set_character_data_handler($simpleparser, "characterData");

if (!($fp = fopen($file, "r"))) {

 die("could not open XML input");

}

while($data = fread($fp, filesize($file))) {

 if (!xml_parse($simpleparser, $data, feof($fp))) {
    die(xml_error_string(xml_get_error_code($simpleparser)));
 }

} xml_parser_free($simpleparser); ?>


      </source>
   
  


SAX parser in action

   <source lang="html4strict">

<? function start_element($parser, $element_name, $element_attrs) {

 switch ($element_name) {
   case "KEYWORDS":
echo "

Keywords

    ";
          break;
       case "KEYWORD":
    
    echo "
  • "; break; } } function end_element($parser, $element_name) { switch ($element_name) { case "KEYWORDS": echo "
";
      break;
   case "KEYWORD":
      echo "</li>";
      break;
 }

}

function character_data($parser, $data) {

 echo htmlentities($data);

} $parser = xml_parser_create(); xml_set_element_handler($parser, "start_element", "end_element"); xml_set_character_data_handler($parser, "character_data"); $fp = fopen("keyword-data.xml", "r")

   or die ("Cannot open keyword-data.xml!");
   
   

while ($data = fread($fp, 4096)) {

 xml_parse($parser, $data, feof($fp)) or 
   die(sprintf("XML ERROR: %s at line %d",
       xml_error_string(xml_get_error_code($parser)),
       xml_get_current_line_number($parser)));

}

xml_parser_free($parser); ?>


      </source>
   
  


Turning an XML Document into an Array

   <source lang="html4strict">

<html> <body> <?php

    $cdata = "";
    $contact_id = -1;
    $contacts = null;
  
    function start_elem ($parser, $name, $attrs) {
         global $contact_id;
         if ($name == "contact") {
              $contact_id = $attrs["id"];
              $contacts[$contact_id] = array();
         }
    }
    function end_elem ($parser, $name) {
         global $cdata, $contacts, $contact_id;
         switch ($name)
         {
              case ("first"):
                   $contacts[$contact_id]["name"]["first"] = $cdata; 
                   break;
              case ("last"):
                   $contacts[$contact_id]["name"]["last"] = $cdata; 
                   break;
              case ("middle"):
                   $contacts[$contact_id]["name"]["middle"] = $cdata; 
                   break;
              case ("title"):
                   $contacts[$contact_id]["title"] = $cdata; 
                   break;
              case ("employer"):
                   $contacts[$contact_id]["employer"] = $cdata; 
                   break;
              case ("dob"):
                   $contacts[$contact_id]["dob"] = $cdata; 
                   break;
         }
         $cdata = "";
    }
    function cdata ($parser, $data) {
         global $cdata;
         $cdata .= trim ($data);
    }
    $file = "contact.xml";
    $parser = xml_parser_create ();
    xml_parser_set_option ($parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler ($parser, "start_elem", "end_elem");
    xml_set_character_data_handler ($parser, "cdata");
    $fp = fopen ($file, "r");
    if (!$fp){
         die ("Couldn"t open $file for reading");
    }
    while ($xml_input = fread ($fp, 2048)) {
         $ok = xml_parse ($parser, $xml_input, feof ($fp));
         if (!$ok){
              die (sprintf ("Error in $file: "%s" at line %d",
                            xml_error_string (xml_get_error_code ($parser)),
                            xml_get_current_line_number ($parser)));
         }
    }
    xml_parser_free ($parser);
print ("
\n");
     print_r ($contacts);
     print ("
\n");

?> </body> </html>

      </source>