Aquí una pequeña porción de la clase que escribí hace un tiempo:
/**
* Class XmlParser
* @author Francesco Casula <[email protected]>
*/
class XmlParser
{
/**
* @param string $xmlFilename Path to the XML file
* @param string $version 1.0
* @param string $encoding utf-8
* @return bool
*/
public function isXMLFileValid($xmlFilename, $version = '1.0', $encoding = 'utf-8')
{
$xmlContent = file_get_contents($xmlFilename);
return $this->isXMLContentValid($xmlContent, $version, $encoding);
}
/**
* @param string $xmlContent A well-formed XML string
* @param string $version 1.0
* @param string $encoding utf-8
* @return bool
*/
public function isXMLContentValid($xmlContent, $version = '1.0', $encoding = 'utf-8')
{
if (trim($xmlContent) == '') {
return false;
}
libxml_use_internal_errors(true);
$doc = new DOMDocument($version, $encoding);
$doc->loadXML($xmlContent);
$errors = libxml_get_errors();
libxml_clear_errors();
return empty($errors);
}
}
Funciona bien con las corrientes y vfsStream mientras ll para fines de prueba.
Cerca de perfeccionar ... acaba de añadir que la función display_xml_error es simplemente una función personalizada para dar salida a los errores de una manera agradable , se puede encontrar aquí http://php.net/manual/en/function.libxml-get-errors.php. Al principio pensé que era una función interna que me estaba perdiendo. – Carlton
Tenga cuidado con 'if (! $ Doc)'! PHP considera por ejemplo un documento de espacio de nombres como vacío y, por lo tanto, '! $ Doc === TRUE'. – David
Me encontré con el problema como @David mencionó, tuve que comprobar explícitamente 'if ($ doc! == FALSE)' en lugar de simplemente 'if ($ doc)' que normalmente sería suficiente. – Samsquanch