PHP Conference Japan 2024

SimpleXMLElement::__construct

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::__construct 建立新的 SimpleXMLElement 物件

說明

public SimpleXMLElement::__construct(
    字串 $data,
    整數 $options = 0,
    布林值 $dataIsURL = false,
    字串 $namespaceOrPrefix = "",
    布林值 $isPrefix = false
)

建立一個新的 SimpleXMLElement 物件。

參數

data

格式良好的 XML 字串,或者如果 dataIsURLtrue,則為 XML 文件的路徑或 URL。

options

選擇性地用於指定額外的 Libxml 參數,這些參數會影響 XML 文件的讀取。影響 XML 文件輸出的選項(例如 LIBXML_NOEMPTYTAG)會被靜默忽略。

注意:

可能需要傳遞 LIBXML_PARSEHUGE 才能處理深度巢狀的 XML 或非常大的文字節點。

dataIsURL

預設情況下,dataIsURLfalse。使用 true 指定 data 是 XML 文件的路徑或 URL,而不是 字串 資料。

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();

?>

參見

新增註記

使用者貢獻的註記 7 則註記

rowan dot collins at gmail dot com
7 年前
說明文件並沒有真正解釋 $ns 參數(以及伴隨的 $is_prefix)的用途。

它們的作用類似於 ->children() 方法:它們將返回物件的上下文設定為該命名空間,以便通過 ->elementName 和 ['attributeName'] 引用該命名空間中的元素和屬性。

特別是,它們*不會*更改文件中存在的命名空間。

請參考此範例

<?php
// 此 XML 包含兩個名為 <child> 的元素
// 一個位於命名空間 http://example.com 中,使用本地前綴 'ws'
// 另一個沒有命名空間(沒有前綴,也沒有宣告預設命名空間)
$xml = '<ws:example xmlns:ws="http://example.com"><child>不在命名空間中</child><ws:child>在 example 命名空間中</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
"
無命名空間:
{$sx0->child}
依命名空間:
{$sx1->child}
依前綴:
{$sx2->child}
"
;
?>

輸出

無命名空間: 不在命名空間中
依命名空間: 在 example 命名空間中
依前綴: 在 example 命名空間中
tudor at culise dot net
17 年前
這個類別是可擴充的,但可惜的是它的建構子不能被覆寫(PHP 說它是一個 final 方法)。因此,應該使用委託原則而不是繼承來包裝這個類別。
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);
info at ensostudio dot ru §
3 年前
延伸 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;
}
}
?>
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);
?>

一切就正常運作,不再出現錯誤。
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();
}
?>
uramihsayibok, gmail, com
15 年前
當我在填寫錯誤報告時,我意識到為什麼(這裡是猜測)建構子是 final:這樣 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。
To Top