利用 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

但是,一旦我們解決了這個問題,我們就會得到快樂的日子