SimpleXML with all of it’s faults is still a great way to interact with XML. Most of it’s shortcomings are related to debugging and how it handles invalid XML is no exception. Let’s take a look at what happens when we load an invalid XML string:

$xml = " <?xml version='1.0'><root><unclosed></root>";

$simple_xml = simplexml_load_string($xml);

if ($simple_xml === false)
{
    throw new Exception('Invalid XML');
}

This will raise the exception because the declaration is malformed and we have an unclosed child node as well. The only indication that SimpleXML will give us is our object not being instantiated and being set to boolean false.

To coerce SimpleXML into playing nice and giving us some errors we can work with we have to set use internal flags to true. Once we do that we can interrogate another function and expose the error message(s).

$xml = " <?xml version='1.0'><root><unclosed></root>";

libxml_use_internal_errors(true);
$simple_xml = simplexml_load_string($xml);

if ($simple_xml === false)
{
    $message = 'Invalid XML: ';

    foreach (libxml_get_errors() as $error)
    {
        $message .= "\n" . $error->message;
    }

    throw new Exception($message);
}

This will raise an exception under the same circumstance, but now we have a verbose error message that we can use to troubleshoot the situation!





Did you enjoy this post?

Cool if I slip into your inbox with more?
Full posts, 1-2 times per week: