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

可选地用于指定 额外的 Libxml 参数,这些参数会影响 XML 文档的读取。影响 XML 文档输出的选项(例如 LIBXML_NOEMPTYTAG)会被静默忽略。

注意:

可能需要传递 LIBXML_PARSEHUGE 才能处理深度嵌套的 XML 或非常大的文本节点。

dataIsURL

默认情况下,dataIsURLfalse。使用 true 指定 data 是指向 XML 文档的路径或 URL,而不是 string 数据。

namespaceOrPrefix

命名空间前缀或 URI。

isPrefix

如果 namespaceOrPrefix 是前缀,则为 true,如果它是 URI,则为 false;默认为 false

错误/异常

为 XML 数据中的每个错误产生一个 E_WARNING 错误消息,并且如果无法解析 XML 数据,还会抛出一个 Exception

提示

使用 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', 0, true);
echo
$sxe->asXML();

?>

参见

添加备注

用户贡献的备注 8 个备注

9
rowan dot collins at gmail dot com
7 年前
手册并没有真正解释 $ns 参数(以及 accompanying $is_prefix)的作用。

它们的作用类似于 ->children() 方法:它们将返回对象的上下文设置为该命名空间,以便通过 ->elementName 和 ['attributeName'] 的访问方式引用该命名空间中的元素和属性。

特别是,它们不会更改文档中存在的命名空间。

参见此示例

<?php
// 此 XML 包含两个名为 <child> 的元素
// 其中一个是 http://example.com, 命名空间,局部前缀为 'ws'
// 另一个没有命名空间(没有前缀,也没有声明默认命名空间)
$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}
"
;
?>

输出

Without: Not in namespace
By namespace: In example namespace
By prefix: In example namespace
9
tudor at culise dot net
16 年前
此类可扩展,但遗憾的是,它的构造函数不可重写(PHP 表示这是一个 final 方法)。因此,应该使用委托原则而不是扩展来包装该类。
5
info at ensostudio dot ru
2 年前
扩展 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 元素属性的名称/值对数组
* @return $this
*/
public function addAttributes(iterable $attributes)
{
foreach (
$attributes as $name => $value) {
$this->addAttribute($name, $value);
}

return
$this;
}

/**
* @param string $name 子元素名称
* @param string|array|null $valueOrAttributes 子元素值或属性数组
* @param string|null $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 子元素的名称/值(或属性)对数组
* @return $this
*/
public function addChilds(iterable $childs)
{
foreach (
$childs as $name => $value) {
$this->addChild($name, $value);
}

return
$this;
}
}
?>
6
ahmad dot mayahi at gmail dot com
8 年前
你无法在没有根元素的情况下加载 XML 文件

// 这将抛出异常
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>', null, false);

// 解决方案
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root></root>', null, false);
4
bertolini dot cedric at me dot com
10 年前
值得注意的是,SimpleXmlElement::__construct 的行为与 simplexml_load_string 并不完全相同,关于 libxml_use_internal_errors()。

在我的案例中,

<?php
libxml_use_internal_errors
(true);
new
\SimpleXmlElement($data);
?>

仍然会抛出错误。但当我切换到

<?php
libxml_use_internal_errors
(true);
simplexml_load_string($data);
?>

一切正常,我停止收到错误。
5
kumarldh at gmail dot com
13 年前
使用 libxml_use_internal_errors() 可能抑制错误,但异常仍然需要适当的处理。我使用了以下代码片段。

<?php
libxml_use_internal_errors
(true);
try{
$xmlToObject = new SimpleXMLElement($notSoWellFormedXML);
} catch (
Exception $e){
echo
'请稍后再试...';
exit();
}
?>
0
uramihsayibok, gmail, com
14 年前
当我填写错误报告时,我意识到为什么(推测)构造函数是最终的:以便像 simplexml_load_file 和 simplexml_load_string 这样的函数能够工作。我想 PHP 化的代码看起来像

<?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);
}

?>

如果我们要使用不同的 $class_name 并更改构造函数的定义,这些函数将无法工作。

没有简单、明智的解决方案可以保留 simplexml_load_file 和 simplexml_load_string。
-1
Phil Cross
9 年前
值得注意的是,你需要将动态属性名称类型转换为字符串才能检索它们的值,例如

<?php
$xml
= new SimpleXMLElement('records.xml', 0, true);

// 这将按预期工作,因为它是硬编码的属性值
foreach($xml as $record){
echo
$record->id; // 将正常输出 ID
}

// 动态属性需要类型转换为字符串
$xml_field = 'id';
foreach(
$xml as $record){

// 这将转储 SimpleXMLElement 对象
var_dump($record->$xml_field);

// 这将按预期输出值
echo (string)$record->$xml_field;
}
?>
To Top