standardized the way we handle XML errors

This commit is contained in:
Fabien Potencier 2012-08-26 18:47:56 +02:00
parent 352e8f583c
commit 865461d204
4 changed files with 48 additions and 28 deletions

View File

@ -211,14 +211,18 @@ class XmlFileLoader extends FileLoader
*/ */
private function parseFile($file) private function parseFile($file)
{ {
$internalErrors = libxml_use_internal_errors(true);
libxml_clear_errors();
$dom = new \DOMDocument(); $dom = new \DOMDocument();
libxml_use_internal_errors(true);
if (!$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors()));
}
$dom->validateOnParse = true; $dom->validateOnParse = true;
if (!$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors($internalErrors)));
}
$dom->normalizeDocument(); $dom->normalizeDocument();
libxml_use_internal_errors(false);
libxml_use_internal_errors($internalErrors);
$this->validate($dom, $file); $this->validate($dom, $file);
return simplexml_import_dom($dom, 'Symfony\\Component\\DependencyInjection\\SimpleXMLElement'); return simplexml_import_dom($dom, 'Symfony\\Component\\DependencyInjection\\SimpleXMLElement');
@ -360,12 +364,14 @@ EOF
; ;
$current = libxml_use_internal_errors(true); $current = libxml_use_internal_errors(true);
libxml_clear_errors();
$valid = $dom->schemaValidateSource($source); $valid = $dom->schemaValidateSource($source);
foreach ($tmpfiles as $tmpfile) { foreach ($tmpfiles as $tmpfile) {
@unlink($tmpfile); @unlink($tmpfile);
} }
if (!$valid) { if (!$valid) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors())); throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors($current)));
} }
libxml_use_internal_errors($current); libxml_use_internal_errors($current);
} }
@ -406,7 +412,7 @@ EOF
* *
* @return array * @return array
*/ */
private function getXmlErrors() private function getXmlErrors($internalErrors)
{ {
$errors = array(); $errors = array();
foreach (libxml_get_errors() as $error) { foreach (libxml_get_errors() as $error) {
@ -421,6 +427,7 @@ EOF
} }
libxml_clear_errors(); libxml_clear_errors();
libxml_use_internal_errors($internalErrors);
return $errors; return $errors;
} }

View File

@ -150,14 +150,18 @@ class XmlFileLoader extends FileLoader
*/ */
protected function loadFile($file) protected function loadFile($file)
{ {
$internalErrors = libxml_use_internal_errors(true);
libxml_clear_errors();
$dom = new \DOMDocument(); $dom = new \DOMDocument();
libxml_use_internal_errors(true);
if (!$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors()));
}
$dom->validateOnParse = true; $dom->validateOnParse = true;
if (!$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors($internalErrors)));
}
$dom->normalizeDocument(); $dom->normalizeDocument();
libxml_use_internal_errors(false);
libxml_use_internal_errors($internalErrors);
$this->validate($dom); $this->validate($dom);
return $dom; return $dom;
@ -175,8 +179,10 @@ class XmlFileLoader extends FileLoader
$location = __DIR__.'/schema/routing/routing-1.0.xsd'; $location = __DIR__.'/schema/routing/routing-1.0.xsd';
$current = libxml_use_internal_errors(true); $current = libxml_use_internal_errors(true);
libxml_clear_errors();
if (!$dom->schemaValidate($location)) { if (!$dom->schemaValidate($location)) {
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors())); throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors($current)));
} }
libxml_use_internal_errors($current); libxml_use_internal_errors($current);
} }
@ -186,7 +192,7 @@ class XmlFileLoader extends FileLoader
* *
* @return array An array of libxml error strings * @return array An array of libxml error strings
*/ */
private function getXmlErrors() private function getXmlErrors($internalErrors)
{ {
$errors = array(); $errors = array();
foreach (libxml_get_errors() as $error) { foreach (libxml_get_errors() as $error) {
@ -201,6 +207,7 @@ class XmlFileLoader extends FileLoader
} }
libxml_clear_errors(); libxml_clear_errors();
libxml_use_internal_errors($internalErrors);
return $errors; return $errors;
} }

View File

@ -55,10 +55,13 @@ class XliffFileLoader implements LoaderInterface
*/ */
private function parseFile($file) private function parseFile($file)
{ {
$internalErrors = libxml_use_internal_errors(true);
libxml_clear_errors();
$dom = new \DOMDocument(); $dom = new \DOMDocument();
$current = libxml_use_internal_errors(true); $dom->validateOnParse = true;
if (!@$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) { if (!@$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
throw new \RuntimeException(implode("\n", $this->getXmlErrors())); throw new \RuntimeException(implode("\n", $this->getXmlErrors($internalErrors)));
} }
$location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd'; $location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
@ -77,11 +80,11 @@ class XliffFileLoader implements LoaderInterface
$source = str_replace('http://www.w3.org/2001/xml.xsd', $location, $source); $source = str_replace('http://www.w3.org/2001/xml.xsd', $location, $source);
if (!@$dom->schemaValidateSource($source)) { if (!@$dom->schemaValidateSource($source)) {
throw new \RuntimeException(implode("\n", $this->getXmlErrors())); throw new \RuntimeException(implode("\n", $this->getXmlErrors($internalErrors)));
} }
$dom->validateOnParse = true;
$dom->normalizeDocument(); $dom->normalizeDocument();
libxml_use_internal_errors($current);
libxml_use_internal_errors($internalErrors);
return simplexml_import_dom($dom); return simplexml_import_dom($dom);
} }
@ -91,7 +94,7 @@ class XliffFileLoader implements LoaderInterface
* *
* @return array An array of errors * @return array An array of errors
*/ */
private function getXmlErrors() private function getXmlErrors($internalErrors)
{ {
$errors = array(); $errors = array();
foreach (libxml_get_errors() as $error) { foreach (libxml_get_errors() as $error) {
@ -106,7 +109,7 @@ class XliffFileLoader implements LoaderInterface
} }
libxml_clear_errors(); libxml_clear_errors();
libxml_use_internal_errors(false); libxml_use_internal_errors($internalErrors);
return $errors; return $errors;
} }

View File

@ -180,22 +180,25 @@ class XmlFileLoader extends FileLoader
*/ */
protected function parseFile($file) protected function parseFile($file)
{ {
$internalErrors = libxml_use_internal_errors(true);
libxml_clear_errors();
$dom = new \DOMDocument(); $dom = new \DOMDocument();
libxml_use_internal_errors(true); $dom->validateOnParse = true;
if (!$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) { if (!$dom->load($file, defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0)) {
throw new MappingException(implode("\n", $this->getXmlErrors())); throw new MappingException(implode("\n", $this->getXmlErrors($internalErrors)));
} }
if (!$dom->schemaValidate(__DIR__.'/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd')) { if (!$dom->schemaValidate(__DIR__.'/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd')) {
throw new MappingException(implode("\n", $this->getXmlErrors())); throw new MappingException(implode("\n", $this->getXmlErrors($internalErrors)));
} }
$dom->validateOnParse = true;
$dom->normalizeDocument(); $dom->normalizeDocument();
libxml_use_internal_errors(false);
libxml_use_internal_errors($internalErrors);
return simplexml_import_dom($dom); return simplexml_import_dom($dom);
} }
protected function getXmlErrors() protected function getXmlErrors($internalErrors)
{ {
$errors = array(); $errors = array();
foreach (libxml_get_errors() as $error) { foreach (libxml_get_errors() as $error) {
@ -210,7 +213,7 @@ class XmlFileLoader extends FileLoader
} }
libxml_clear_errors(); libxml_clear_errors();
libxml_use_internal_errors(false); libxml_use_internal_errors($internalErrors);
return $errors; return $errors;
} }