PHP 7.4.24 Released!

SimpleXMLElement::__construct

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::__construct 新しい SimpleXMLElement オブジェクトを作成する

説明

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

新しい SimpleXMLElement オブジェクトを作成します。

パラメータ

data

整形式 XML 文字列。 もし dataIsURLtrue の場合には、XML ドキュメントへのパスあるいは URL。

options

オプションで、XML文書を読み込む場合に影響する 追加の Libxml パラメータを指定するために使います。 XML文書を出力する場合に影響するオプション(例: LIBXML_NOEMPTYTAG) は静かに無視されます。

注意:

深くネストされた XML や巨大なテキストノードを処理する際には LIBXML_PARSEHUGE を指定することになるでしょう。

dataIsURL

デフォルトでは dataIsURLfalse です。 data が、文字列データではなく XML ドキュメントへのパスあるいは URL である場合に true を使用します。

namespaceOrPrefix

名前空間プレフィックスあるいは URI。

isPrefix

namespaceOrPrefix がプレフィックスの場合は true、 URI の場合は false。デフォルトは false

返り値

data を表す SimpleXMLElement オブジェクトを返します。

エラー / 例外

XML データ内でエラーが見つかるたびに E_WARNING エラーメッセージが発生します。さらに、XML データのパースに失敗した場合は例外をスローします。

ヒント

libxml_use_internal_errors() ですべての XML エラーを抑制し、 後から libxml_get_errors() で取得することもできます。

注意:

この例では example.php をインクルードしていますが、これは 基本的な使用法 の最初のサンプルにある XML 文字列を参照しています。

例1 SimpleXMLElement オブジェクトの作成

<?php

include 'example.php';

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

?>

上の例の出力は以下となります。

PHP: Behind the Parser

例2 URL からの SimpleXMLElement オブジェクトの作成

<?php

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

?>

参考

add a note add a note

User Contributed Notes 8 notes

up
10
tudor at culise dot net
13 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
rowan dot collins at gmail dot com
4 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
5
ahmad dot mayahi at gmail dot com
5 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
bertolini dot cedric at me dot com
7 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
4
kumarldh at gmail dot com
10 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
1
info at ensostudio dot ru
1 month 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
-1
uramihsayibok, gmail, com
12 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.
up
-2
Phil Cross
7 years ago
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;
    }
?>
To Top