Ciao
Sto scrivendo delle funzioni in una classe che mi servono per aprire un file xml fare la validazione e parsarlo poi successivamente in un array.
Il problema è che non entra in funzione l'handler che ho assegnato alla funzione xml_set_external_entity_ref_handler per cui se nell'xml ho nella prima riga un DTD esterno come
codice:
<?xml version="1.0"?>
<!DOCTYPE registry SYSTEM "application.dtd">
non mi valida l'xml in base al DTD.
Io volgio che preso in input il file xml lo validi in base al DTD per verificare la correttezza del documento.Il problema è solo per l'handler external_entity_ref del resto se nell'xml ci sono errori me li segnala correttamente..
Vi posto le funzioni della classe per l'xml:
Codice PHP:
class Xml {
function parserDefaultHandler($base) {
if (!($fp = fopen($base, 'r')))
die(sprintf("Error opening file: %s not found\n", $filename));
$parser = xml_parser_create();
xml_set_external_entity_ref_handler($parser, 'parserExternalEntityRefHandler');
return array($fp, $parser);
}
function parserExternalEntityRefHandler($parser, $entityNames, $base, $systemId, $publicId) {
if ($systemId == '')
return false;
list($fp, $parser)= $this->parserDefaultHandler($systemId);
while ($line = fread($fp, 4096)) {
if (!xml_parse($parser, $line, feof($fp)))
die(sprintf("Error parsing %s:%s\n",$filename, xml_error_string(xml_get_error_code($parser))));
}
xml_parser_free($parser);
return true;
}
function parseXML($base) {
list($fp, $parser) = $this->parserDefaultHandler($base);
while ($buffer[] = $line = fread($fp, 4096)) {
if (!xml_parse($parser, $line, feof($fp)))
die(sprintf("Error parsing %s:%s\n",$filename, xml_error_string(xml_get_error_code($parser))));
}
xml_parse_into_struct($parser, $buffer, &$data, & $indexes);
xml_parser_free($parser);
return $data;
}
}
non capisco Dove sbaglio ??