PHP 8.4.2 Released!

Lidando com erros XML

Lidar com erros de XML ao carregar documentos é uma tarefa muito simples. Usando a funcionalidade libxml é possível suprimir todos os erros XML ao carregar o documento e então iterar sobre os erros.

O objeto libXMLError, retornado por libxml_get_errors(), contém várias propriedades incluindo a mensagem, a linha e a coluna (posição) do erro.

Exemplo #1 Carregando string XML quebrada

<?php
libxml_use_internal_errors
(true);
$sxe = simplexml_load_string("<?xml version='1.0'><quebrada><xml></quebrada>");
if (
$sxe === false) {
echo
"Falha ao carregar o XML\n";
foreach(
libxml_get_errors() as $error) {
echo
"\t", $error->message;
}
}
?>

O exemplo acima produzirá:

Falha ao carregar o XML
    Blank needed here
    parsing XML declaration: '?>' expected
    Opening and ending tag mismatch: xml line 1 and quebrada
    Premature end of data in tag quebrada line 1

adicione uma nota

Notas Enviadas por Usuários (em inglês) 3 notes

up
22
openbip at gmail dot com
14 years ago
Note that "if (! $sxe) {" may give you a false-negative if the XML document was empty (e.g. "<root />"). In that case, $sxe will be:

object(SimpleXMLElement)#1 (0) {
}

which will evaluate to false, even though nothing technically went wrong.

Consider instead: "if ($sxe === false) {"
up
2
1337 at netapp dot com
9 years ago
If you need to process the content of your broken XML-doc you might find this interesting. It has blown past a few simple corruptions for me.
http://php.net/manual/en/class.domdocument.php#domdocument.props.recover
up
4
tuxedobob
10 years ago
Now that the /e modifier is considered deprecated in preg_replace, you can use a negative lookahead to replace unescaped ampersands with &amp; without throwing warnings:

$str = preg_replace('/&(?!;{6})/', '&amp;', $str);

You probably should have been doing this before /e was deprecated, actually.
To Top