This class is extendable, but it's too bad that its constructor cannot be overriden (PHP says it's a final method). Thus the class should be wrapped using the delegation principle rather that extended.
(PHP 5 >= 5.0.1, PHP 7)
SimpleXMLElement::__construct — Creates a new SimpleXMLElement object
$data
[, int $options
= 0
[, bool $data_is_url
= false
[, string $ns
= ""
[, bool $is_prefix
= false
]]]] )Creates a new SimpleXMLElement object.
data
A well-formed XML string or the path or URL to an XML document if
data_is_url
is TRUE
.
options
Optionally used to specify additional Libxml parameters.
data_is_url
By default, data_is_url
is FALSE
. Use TRUE
to
specify that data
is a path or URL to an XML
document instead of string data.
ns
Namespace prefix or URI.
is_prefix
TRUE
if ns
is a prefix, FALSE
if it's a URI;
defaults to FALSE
.
Returns a SimpleXMLElement object representing
data
.
Produces an E_WARNING
error message for each error
found in the XML data and additionally throws an Exception if the XML data
could not be parsed.
Use libxml_use_internal_errors() to suppress all XML errors, and libxml_get_errors() to iterate over them afterwards.
Note:
Listed examples may include example.php, which refers to the XML string found in the first example of the basic usage guide.
Example #1 Create a SimpleXMLElement object
<?php
include 'example.php';
$sxe = new SimpleXMLElement($xmlstr);
echo $sxe->movie[0]->title;
?>
The above example will output:
PHP: Behind the Parser
Example #2 Create a SimpleXMLElement object from a URL
<?php
$sxe = new SimpleXMLElement('http://example.org/document.xml', NULL, TRUE);
echo $sxe->asXML();
?>
Version | Description |
---|---|
5.2.0 | Added the ns and is_prefix parameters. |
5.1.2 | Added the options and data_is_url parameters. |
This class is extendable, but it's too bad that its constructor cannot be overriden (PHP says it's a final method). Thus the class should be wrapped using the delegation principle rather that extended.
It's worth noting, that you need to typecast dynamic property names to string in order to retrieve there value, for example:
<?php
$xml = new SimpleXMLElement('records.xml', 0, true);
// This will work as expected because its a hard coded property value
foreach($xml as $record){
echo $record->id; // Will output the ID fine
}
// Dynamic properties require typecasting to string
$xml_field = 'id';
foreach($xml as $record){
// This will dump a SimpleXMLElement object
var_dump($record->$xml_field);
// This will output the value as expected
echo (string)$record->$xml_field;
}
?>
It's worth noting that the behavior of SimpleXmlElement::__construct is not exactly the same as simplexml_load_string, regarding libxml_use_internal_errors().
In my case,
<?php
libxml_use_internal_errors(true);
new \SimpleXmlElement($data);
?>
was still throwing error. But as soon as I switched to
<?php
libxml_use_internal_errors(true);
simplexml_load_string($data);
?>
everything worked fine and I stopped getting an error.
Using libxml_use_internal_errors() may suppress errors but Exception still requires decent handling. I used following code snippet.
<?php
libxml_use_internal_errors(true);
try{
$xmlToObject = new SimpleXMLElement($notSoWellFormedXML);
} catch (Exception $e){
echo 'Please try again later...';
exit();
}
?>
As I was filling out a bug report, I realized why (speculation here) the constructor is final: so that functions like simplexml_load_file and simplexml_load_string can work. I imagine the PHP-ized code looks something like
<?php
function simplexml_load_file($filename, $class_name = "SimpleXMLElement", $options = 0, $ns = "", $is_prefix = false) {
return new $class_name($filename, $options, true, $ns, $is_prefix);
}
?>
If we were to use a different $class_name and change the constructor's definition these functions wouldn't work.
There's no easy, sensible solution that keeps simplexml_load_file and simplexml_load_string.