PHP/XML/SAX
Содержание
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; 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>