Now XMLDB Editor performs check/validation of XML files

before loading them using the best parser available.
MDL-7726 and first part of MDL-8264

Merged from MOODLE_18_STABLE
This commit is contained in:
stronk7
2007-02-23 20:59:28 +00:00
parent fc12edcd5d
commit 776dee9c56
2 changed files with 81 additions and 0 deletions
+78
View File
@@ -29,6 +29,8 @@
class XMLDBFile extends XMLDBObject {
var $path;
var $schema;
var $dtd;
var $xmldb_structure;
/**
@@ -64,11 +66,73 @@ class XMLDBFile extends XMLDBObject {
return $this->xmldb_structure;
}
/**
* This function will check/validate the XML file for correctness
* Dinamically if will use the best available checker/validator
* (expat syntax checker or DOM schema validator
*/
function validateXMLStructure() {
/// Going to perform complete DOM schema validation
if (extension_loaded('dom')) {
/// Let's capture errors
libxml_use_internal_errors(true);
/// Create and load XML file
$parser = new DOMDocument();
$parser->load($this->path);
/// Validate XML file against schema
if (!$parser->schemaValidate($this->schema)) {
/// Get errors
$errors = libxml_get_errors();
/// Create one structure to store errors
$structure = new XMLDBStructure($this->path);
/// Add errors to structure
$structure->errormsg = 'XML Error: ';
foreach ($errors as $error) {
$structure->errormsg .= sprintf("%s at line %d. ",
trim($error->message, "\n\r\t ."),
$error->line);
}
/// Add structure to file
$this->xmldb_structure = $structure;
/// Check has failed
return false;
}
}
/// Going to perform expat simple check (no validation)
else if (function_exists('xml_parser_create')) {
$parser = xml_parser_create();
if (!xml_parse($parser, file_get_contents($this->path))) {
/// Create one structure to store errors
$structure = new XMLDBStructure($this->path);
/// Add error to structure
$structure->errormsg = sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser));
/// Add structure to file
$this->xmldb_structure = $structure;
/// Check has failed
return false;
}
/// Free parser resources
xml_parser_free($parser);
}
/// Arriving here, something is really wrong because nor dom not expat are present
else {
return false;
}
return true;
}
/**
* Load and the XMLDB structure from file
*/
function loadXMLStructure() {
if ($this->fileExists()) {
/// Let's validate the XML file
if (!$this->validateXMLStructure()) {
return false;
}
/// File exists, so let's process it
/// Load everything to a big array
$xmlarr = xmlize(file_get_contents($this->path));
@@ -94,6 +158,20 @@ class XMLDBFile extends XMLDBObject {
return $structure;
}
/**
* This function sets the DTD of the XML file
*/
function setDTD($path) {
$this->dtd = $path;
}
/**
* This function sets the schema of the XML file
*/
function setSchema($path) {
$this->schema = $path;
}
/**
* This function saves the whole XMLDBStructure to its file
*/