&reftitle.examples;
Exemple de structure XML Ce premier exemple affiche la structure de l'élément de début dans un document avec indentation. Afficher une structure XML ]]>
Transtypage XML -> HTML Transtypage XML -> HTML Cet exemple remplace les balises XML d'un document par des balises HTML. Les éléments inconnus seront ignorés. Bien entendu, cet exemple sera appliqué à un type précis de fichiers XML. "B", "EMPHASIS" => "I", "LITERAL" => "TT" ); function startElement($parser, $name, $attrs) { global $map_array; if (isset($map_array[$name])) { echo "<$map_array[$name]>"; } } function endElement($parser, $name) { global $map_array; if (isset($map_array[$name])) { echo ""; } } function characterData($parser, $data) { echo $data; } $xml_parser = xml_parser_create(); // Utilisons la gestion de casse, de manière à être sûrs de trouver la balise dans $map_array xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("Erreur XML: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } ?> ]]>
Entité externe Cet exemple exploite les références externes de XML : il est possible d'utiliser un gestionnaire d'entité externe pour inclure et analyser les documents, tout comme les instructions exécutables peuvent servir à inclure et analyser d'autres documents, et aussi fournir une indication de confiance (voir plus bas). Le document XML qui est utilisé dans cet exemple est fourni plus loin dans l'exemple (xmltest.xml et xmltest2.xml). Entité externe $name"; if (count($attribs)) { foreach ($attribs as $k => $v) { echo " $k=\"$v\""; } } echo ">"; } function endElement($parser, $name) { echo "</$name>"; } function characterData($parser, $data) { echo "$data"; } function PIHandler($parser, $target, $data) { switch (strtolower($target)) { case "php": global $parser_file; // si le document analysé est de confiance, nous déclarons qu'il est sûr // d'exécuter le code PHP qu'il contient. Si ce n'est pas le cas, le code est affiché // à la place. if (trustedFile($parser_file[$parser])) { eval($data); } else { printf("Untrusted PHP code: %s", htmlspecialchars($data)); } break; } } function defaultHandler($parser, $data) { if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") { printf('%s', htmlspecialchars($data)); } else { printf('%s', htmlspecialchars($data)); } } function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId, $publicId) { if ($systemId) { if (!list($parser, $fp) = new_xml_parser($systemId)) { printf("Could not open entity %s at %s\n", $openEntityNames, $systemId); return false; } while ($data = fread($fp, 4096)) { if (!xml_parse($parser, $data, feof($fp))) { printf("XML error: %s at line %d while parsing entity %s\n", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser), $openEntityNames); return false; } } return true; } return false; } function new_xml_parser($file) { global $parser_file; $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); xml_set_processing_instruction_handler($xml_parser, "PIHandler"); xml_set_default_handler($xml_parser, "defaultHandler"); xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler"); if (!($fp = @fopen($file, "r"))) { return false; } if (!is_array($parser_file)) { settype($parser_file, "array"); } $parser_file[$xml_parser] = $file; return array($xml_parser, $fp); } if (!(list($xml_parser, $fp) = new_xml_parser($file))) { die("could not open XML input"); } echo "
";
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d\n",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
echo "
"; echo "parse complete\n"; ?> ]]>
xmltest.xml ]> Title &plainEntity; a1b1c1 a2c2 a3b3c3 &systemEntity;
About this Document
]]>
Ce fichier est inclus depuis xmltest.xml : xmltest2.xml ]> &testEnt; ]]>
Analyse XML avec une classe Cet exemple montre comment utiliser une classe avec des gestionnaires. Afficher la structure des éléments XML fp = fopen($file, 'r'))) { throw new RunTimeException("impossible d'ouvrir le fichier XML '{$file}'"); } $this->parser = xml_parser_create(); xml_set_element_handler($this->parser, self::startElement(...), self::endElement(...)); xml_set_character_data_handler($this->parser, self::cdata(...)); } private function startElement($parser, $name, $attrs) { for ($i = 0; $i < $this->depth; $i++) { echo " "; } echo "$name\n"; $this->depth++; } private function endElement($parser, $name) { $this->depth--; } private function cdata($parser, $cdata) { if (trim($cdata) === '') { return; } for ($i = 0; $i < $this->depth; $i++) { echo " "; } echo trim($cdata), "\n"; } public function parse() { while ($data = fread($this->fp, 4096)) { if (!xml_parse($this->parser, $data, feof($this->fp))) { throw new RunTimeException( sprintf( "Erreur XML : %s à la ligne %d", xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser) ) ); } } } } $xmlParser = new CustomXMLParser($file); $xmlParser->parse(); ?> ]]>