PHP 8.5.0 Alpha 1 available for testing

SimpleXMLElement::__construct

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::__construct Crea un nuevo objeto SimpleXMLElement

Descripción

public SimpleXMLElement::__construct(
    string $data,
    int $options = 0,
    bool $dataIsURL = false,
    string $namespaceOrPrefix = "",
    bool $isPrefix = false
)

Crea un nuevo objeto SimpleXMLElement.

Parámetros

data

Una cadena XML bien formada o la ruta de acceso o un URL que apunta a un documento XML si dataIsURL vale true.

options

Opcionalmente utilizado para especificar parámetros adicionales de Libxml, que afectan la lectura de documentos XML. Las opciones que afectan la salida de los documentos XML (por ejemplo LIBXML_NOEMPTYTAG) son ignoradas silenciosamente.

Nota:

Puede ser necesario pasar LIBXML_PARSEHUGE para poder tratar nodos de texto profundamente anidados o muy voluminosos.

dataIsURL

Por omisión, dataIsURL vale false. Utilice true para especificar que el parámetro data es una ruta de acceso o un URL que apunta a un documento XML en lugar de una cadena de datos.

namespaceOrPrefix

Prefijo de espacio de nombres o URI.

isPrefix

true si namespaceOrPrefix es un prefijo, false en caso contrario. Valor por omisión: false.

Errores/Excepciones

Produce un mensaje de error de tipo E_WARNING para cada error encontrado en los datos XML y lanza también una exception si los datos XML no pueden ser analizados.

Sugerencia

Utilice la función libxml_use_internal_errors() para suprimir todos los errores XML y la función libxml_get_errors() para recorrerlos.

Ejemplos

Nota:

Los ejemplos listados incluyen a veces examples/simplexml-data.php, esto hace referencia a la cadena XML del primer ejemplo de el uso básico.

Ejemplo #1 Crea un objeto SimpleXMLElement

<?php

include 'examples/simplexml-data.php';

$sxe = new SimpleXMLElement($xmlstr);
echo
$sxe->movie[0]->title;

?>

El resultado del ejemplo sería:

PHP: Behind the Parser

Ejemplo #2 Crea un objeto SimpleXMLElement a partir de un URL

<?php

$sxe
= new SimpleXMLElement('http://example.org/document.xml', 0, true);
echo
$sxe->asXML();

?>

Ver también

add a note

User Contributed Notes 7 notes

up
9
rowan dot collins at gmail dot com
8 years ago
The manual doesn't really explain what the $ns argument (and the accompanying $is_prefix) are for.

What they do is similar to the ->children() method: they set the context of the returned object to that namespace, so that access via ->elementName and ['attributeName'] refer to elements and attributes in that namespace.

In particular, they do *not* change the namespaces which exist on the document.

See this example:

<?php
// This XML contains two elements called <child>
// One is in the namespace http://example.com, with local prefix 'ws'
// The other has no namespace (no prefix, and no default namespace declared)
$xml = '<ws:example xmlns:ws="http://example.com"><child>Not in namespace</child><ws:child>In example namespace</ws:child></ws:example>';

$sx0 = new SimpleXMLElement($xml, 0, false);
$sx1 = new SimpleXMLElement($xml, 0, false, 'http://example.com');
$sx2 = new SimpleXMLElement($xml, 0, false, 'ws', true);

echo
"
Without:
{$sx0->child}
By namespace:
{$sx1->child}
By prefix:
{$sx2->child}
"
;
?>

Output:

Without: Not in namespace
By namespace: In example namespace
By prefix: In example namespace
up
9
tudor at culise dot net
17 years ago
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.
up
6
ahmad dot mayahi at gmail dot com
9 years ago
You won't be able to load an XML file without root element:

//This will throw an exception
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>', null, false);

//Here is the solution
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root></root>', null, false);
up
4
info at ensostudio dot ru
3 years ago
Extended SimpleXMLElement:
<?php
class XmlElement extends \SimpleXMLElement
{
public static function
factory(string $root): self
{
return new static(
'<?xml version="1.0" encoding="UTF-8"?><'.$root.'/>', LIBXML_BIGLINES | LIBXML_COMPACT);
}

/**
* @param iterable $attributes An array of element attributes as name/value pairs
* @return $this
*/
public function addAttributes(iterable $attributes)
{
foreach (
$attributes as $name => $value) {
$this->addAttribute($name, $value);
}

return
$this;
}

/**
* @param string $name The sub-element name
* @param string|array|null $valueOrAttributes The sub-element value or an array of attributes
* @param string|null $namespace The sub-element namespace
* @return static|null
*/
public function addChild($name, $valueOrAttributes = null, $namespace = null)
{
if (
is_array($valueOrAttributes)) {
$child = parent::addChild($name, null, $namespace);
foreach (
$valueOrAttributes as $name => $value) {
$child->addAttribute($name, $value);
}
} else {
$child = parent::addChild($name, $valueOrAttributes, $namespace);
}

return
$child;
}

/**
* @param iterable $childs An array of sub-elements as name/value(or attributes) pairs
* @return $this
*/
public function addChilds(iterable $childs)
{
foreach (
$childs as $name => $value) {
$this->addChild($name, $value);
}

return
$this;
}
}
?>
up
4
bertolini dot cedric at me dot com
11 years ago
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.
up
5
kumarldh at gmail dot com
14 years ago
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();
}
?>
up
0
uramihsayibok, gmail, com
15 years ago
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.
To Top