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

但是,一旦我们解决了这个问题,我们就会得到快乐的日子