利用 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
但是,一旦我们解决了这个问题,我们就会得到快乐的日子。