PHP 日本研討會 2024

XMLReader::read

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::read將游標移動到文件中的下一個節點

描述

public XMLReader::read(): bool

將游標移動到文件中的下一個節點。

參數

此函式沒有參數。

回傳值

成功時回傳 true,失敗時回傳 false

參見

新增註解

使用者貢獻的註解 5 則註解

jirka at kosek dot cz
18 年前
libxml2 包含更有用的方法 readString(),它會讀取並回傳元素的整個文字內容。您可以在收到開始標籤 (XMLReader::ELEMENT) 後呼叫它。您可以使用此 PHP 程式碼來模擬此方法,直到 PHP 直接呼叫底層的 libxml2 實作。

<?php
class XMLReader2 extends XMLReader
{
function
readString()
{
$depth = 1;
$text = "";

while (
$this->read() && $depth != 0)
{
if (
in_array($this->nodeType, array(XMLReader::TEXT, XMLReader::CDATA, XMLReader::WHITESPACE, XMLReader::SIGNIFICANT_WHITESPACE)))
$text .= $this->value;
if (
$this->nodeType == XMLReader::ELEMENT) $depth++;
if (
$this->nodeType == XMLReader::END_ELEMENT) $depth--;
}
return
$text;
}
}
?>

只需使用 XMLReader2 而非 XMLReader。
Nate
13 年前
值得注意的是,此函式也會在結束標籤處停止。我的 XML 文件類似於以下內容

<root>
<columns>
<column>columnX</column>
<column>columnY</column>
</columns>
<table>
<row>
<columnX>38</columnX>
<columnY>50</columnY>
</row>
<row>
<columnX>82</columnY>
<columnY>28</columnY>
</row>
...
</table>
</root>

我需要剖析 <columns> 物件,才能知道要從每個 <row> 節點檢查哪些屬性。因此,我正在執行以下操作

<?php
while ($xml->read()) {
if (
$xml->name === 'column') {
// 將 column 節點剖析到 $columns 陣列中
}
elseif (
$xml->name === 'row') {
// 使用建構的 $columns 陣列剖析 row 節點
}
}
?>

這種方式某種程度上奏效,因為我最終得到了一個包含所有我想要資料的陣列,但建構的陣列比我預期的還要大兩倍,而且每個其他條目都是空的。我花了一段時間來除錯,但最終發現檢查 <?php $xml->name === 'row' ?> 會同時匹配 <row> 和 </row>,所以檢查應該更像是

<?php

if ($xml->name === 'row' && $xml->nodeType == XMLReader::ELEMENT) {
// 剖析 row 節點
}

?>

我原本想改用 next() 函式,但由於我需要剖析 2 個不同的子樹,我無法找出如何找到所有欄位,重設指標,然後找到所有列。
peter at 3xe dot co dot uk
8 年前
解決「也會讀取結束標籤」這個問題的另一種方法

<?php
$reader
= new XMLReader();
$reader->open('users.xml');

while (
$reader->read()) {
if (
$reader->nodeType == XMLReader::END_ELEMENT) {
continue;
// 跳過此迭代中的剩餘程式碼
}
// 使用所需的節點類型執行某些操作
if($reader->name == 'user') {
//...
}
}
?>
ecziegler at gmail
10 年前
如果您也像我一樣,為了這個問題在網路上翻天覆地尋找解決方案
PHP 警告:XMLReader::read():/tmp/xml_feed.xml:4183934:剖析器錯誤:輸入不是正確的 UTF-8,請指示編碼!

由於某些原因,此警告會中斷執行 - 它是不是偽裝的致命錯誤?

經過幾天的挫敗,我找到了!!!!
tidy -xml -o output.xml -utf8 -f error.log input.xml

您可以使用 exec 叫用 tidy,轉換一個 250Mb 的 feed 需要幾秒鐘,但值得花時間。

在我的情況下,問題出在 latin1 字元集,而且由於某些原因,我必須將 xml 通過 tidy 2 次 - 第一次會產生新的錯誤,第二次會修復所有問題。

我知道無效的 xml 應該由 xml 建立者修復,但在現實世界中,運作方式不同。
匿名
9 年前
> 我原本想改用 next() 函式,但由於我需要剖析 2 個不同的子樹,我無法找出如何找到所有欄位,重設指標,然後找到所有列。

我只是使用

$reader->close();
$reader->open($url);

來重設指標。
To Top