PHP Conference Japan 2024

xml_parser_create

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_create建立 XML 解析器

說明

xml_parser_create(?字串 $encoding = null): XMLParser

xml_parser_create() 會建立一個新的 XML 解析器,並回傳一個 XMLParser 實例,供其他 XML 函式使用。

參數

encoding

輸入編碼會自動偵測,因此 encoding 參數僅指定輸出編碼。如果傳入空字串,解析器會嘗試透過查看標頭的 3 或 4 個位元組來識別文件所使用的編碼。預設輸出字元集為 UTF-8。支援的編碼有 ISO-8859-1UTF-8US-ASCII

回傳值

回傳一個新的 XMLParser 實例。

更新日誌

版本 說明
8.0.0 此函式現在回傳一個 XMLParser 實例;先前會回傳一個 資源,或者在失敗時回傳 false
8.0.0 encoding 現在可以為 null。

另請參閱

新增筆記

使用者貢獻的筆記 5 則筆記

marek995 at seznam dot cz
14 年前
我建立了一個函式,它結合了 xml_paresr_create 和所有相關函式。

<?php
function html_parse($file)
{
$array = str_split($file, 1);
$count = false;
$text = "";
$end = false;
foreach(
$array as $temp)
{
switch(
$temp)
{
case
"<":
between($text);
$text = "";
$count = true;
$end = false;
break;
case
">":
if(
$end == true) {end_tag($text);}
else {
start_tag($text);}
$text = "";
break;
case
"/":
if(
$count == true) {$end = true;}
else {
$text = $text . "/";}
break;
default:
$count = false;
$text = $text . $temp;
}
}
}
?>
輸入值是一個字串。
它會像原始的 XML 解析器一樣呼叫 `start_tag()`、`between()` 和 `end_tag()` 函式。

但它有一些不同之處:
- 它**不**會檢查程式碼。只是將值重新傳送給這三個函式,無論它們是否正確。
- 它可以處理參數。例如:從標籤 <sth b="42"> 傳送 sth b="42"
- 它可以處理特殊符號。原始的解析器有時會將第一個特殊符號出現之前的文字包裝起來。
- 支援所有編碼。如果輸入是 UTF-8,輸出也將是 UTF-8。
- 它處理字串,而不是檔案指標。
- 沒有「保留的 XML 名稱」錯誤。
- 不需要 DOCTYPE。
- 它不處理註解、備註、程式指令等。只處理標籤。

處理函式的定義如下:

<?php
function between($stuff) {}
?>

沒有其他屬性。
jcalvert at gmx dot net
20 年前
為了維持 PHP4 和 PHP5 之間的相容性,您應該一律傳遞字串參數給這個函式。如果您省略它,PHP4 會自動偵測輸入的格式,而 PHP5 會假設格式為 ISO-8859-1(並且會在 UTF-8 檔案的位元組順序標記上出錯)。

<?php $res = xml_parser_create('') ?> 的方式呼叫函式會使兩個版本的 PHP 自動偵測格式。
Tobbe
19 年前
上述的「XML 轉陣列」程式碼在同層級且名稱相同的標籤出現多次時無法正常運作,例如:

<currenterrors>
<error>
<description>這是一個真正的錯誤...</description>
</error>
<error>
<description>這是第二個錯誤...</description>
</error>
<error>
<description>今天錯誤好多...</description>
</error>
<error>
<description>這是最後一個錯誤...</description>
</error>
</currenterrors>

它只會顯示第一個 <error> 標籤。
在這種情況下,您需要自動編號標籤,或者為每個新元素使用多個陣列。
php at stock-consulting dot com
19 年前
即使我傳遞「UTF-8」作為編碼類型,PHP(版本 4.3.3)*並未*將輸入檔案視為 UTF-8。輸入檔案缺少 BOM 標頭位元組(根據 RFC3629,BOM 標頭的確可以省略... 但這部分的說明有點不清楚。RFC 似乎只是對 BOM 標頭提出建議)。如果您要確保 PHP 正確處理 UTF-8 編碼的檔案,請確保檔案以對應的 3 位元組 BOM 標頭 (0xEF 0xBB 0xBF) 開頭。
bishop at php dot net
5 年前
內部團隊已提議[1]將此擴充功能從基於資源的改為基於物件的。進行此變更後,xml_parser_create 將返回一個物件,而不是資源。建議應用程式開發人員將任何明確成功的檢查,例如:

<?php
$res
= xml_parser_create(/*...*/);
if (!
is_resource($res)) {
// ...
}
?>

改為明確失敗的檢查:
<?php
$res
= xml_parser_create(/*...*/);
if (
false === $res) {
// ...
}

[
1]: https://marc.info/?l=php-internals&m=154998365013373&w=2
To Top