利用 XML 與 PHP SimpleXML 庫
SimpleXML 是一個功能強大的庫,它將 XML 字串轉換為易於使用的 PHP 物件。
以下假設 XML 結構如下。
<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</document>
將我們的資料讀入 SimpleXML
首先,我們需要將資料讀入 SimpleXML。我們可以用 3 種不同的方式做到這一點。首先,我們可以從 DOM 節點載入資料。
$xmlElement = simplexml_import_dom($domNode);
我們的下一個選擇是從 XML 檔案載入我們的資料。
$xmlElement = simplexml_load_file($filename);
最後,我們可以從變數載入資料。
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</document>';
$xmlElement = simplexml_load_string($xmlString);
無論你是從 DOM 元素 ,檔案還是字串中選擇載入,現在都會留下名為 $xmlElement
的 SimpleXMLElement 變數。現在,我們可以開始在 PHP 中使用我們的 XML。
訪問我們的 SimpleXML 資料
在 SimpleXMLElement 物件中訪問資料的最簡單方法是直接呼叫屬性 。如果我們想訪問我們的第一個 bookName,StackOverflow SimpleXML Example
,那麼我們可以按照下面的方式訪問它。
echo $xmlElement->book->bookName;
在這一點上,SimpleXML 將假設因為我們沒有明確地告訴它我們想要哪本書,我們想要第一本書。但是,如果我們決定不想要第一個,而不是我們想要 Another SimpleXML Example
,那麼我們可以按照下面的方式訪問它。
echo $xmlElement->book[1]->bookName;
值得注意的是,使用 [0]
的工作原理與不使用它相同,所以
$xmlElement->book
與…一樣的工作
$xmlElement->book[0]
迴圈使用我們的 XML
你可能希望迴圈使用 XML 的原因有很多,例如,你有許多專案,我們的案例中的書籍,我們希望在網頁上顯示。為此,我們可以使用 foreach 迴圈或標準 for 迴圈 ,利用 SimpleXMLElement 的 count 函式。 。
foreach ( $xmlElement->book as $thisBook ) {
echo $thisBook->bookName
}
要麼
$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
echo $xmlElement->book[$i]->bookName;
}
處理錯誤
現在我們到目前為止,重要的是要意識到我們只是人類,並且最終可能會遇到錯誤 - 特別是如果我們一直在玩不同的 XML 檔案。因此,我們希望處理這些錯誤。
考慮我們建立了一個 XML 檔案。你會注意到雖然這個 XML 與我們之前的 XML 非常相似,但是這個 XML 檔案的問題是最終的結束標記是/ doc 而不是/ document。
<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</doc>
現在,比方說,我們將它作為$ file 載入到我們的 PHP 中。
libxml_use_internal_errors(true);
$xmlElement = simplexml_load_file($file);
if ( $xmlElement === false ) {
$errors = libxml_get_errors();
foreach ( $errors as $thisError ) {
switch ( $thisError->level ) {
case LIBXML_ERR_FATAL:
echo "FATAL ERROR: ";
break;
case LIBXML_ERR_ERROR:
echo "Non Fatal Error: ";
break;
case LIBXML_ERR_WARNING:
echo "Warning: ";
break;
}
echo $thisError->code . PHP_EOL .
'Message: ' . $thisError->message . PHP_EOL .
'Line: ' . $thisError->line . PHP_EOL .
'Column: ' . $thisError->column . PHP_EOL .
'File: ' . $thisError->file;
}
libxml_clear_errors();
} else {
echo 'Happy Days';
}
我們將受到以下歡迎
FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc
Line: 13
Column: 10
File: filepath/filename.xml
但是,一旦我們解決了這個問題,我們就會得到快樂的日子。