Skip to content

PHP XML Expat 解析器

SimpleXML 扩展提供了一种非常直接的方式来在 PHP 中解析和浏览 XML 文档。它将 XML 文档表示为一个对象,使得数据访问感觉自然。

SimpleXML 通常是从简单、结构良好的 XML 文件或字符串中读取数据的最简单方法。

您可以从文件或直接从字符串加载 XML。

示例 XML 文件(note.xml):

<?xml version="1.0" encoding="UTF-8"?>
<note importance="high">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
<tags>
<tag>urgent</tag>
<tag>personal</tag>
</tags>
</note>

使用 PHP 加载和解析:

<?php
// 确保报告 XML 解析错误
libxml_use_internal_errors(true);
$xmlFile = 'note.xml';
if (file_exists($xmlFile)) {
$xml = simplexml_load_file($xmlFile);
if ($xml === false) {
echo "Failed loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
} else {
// 作为对象属性访问元素
echo "To: " . htmlspecialchars($xml->to) . "<br>";
echo "From: " . htmlspecialchars($xml->from) . "<br>";
echo "Heading: " . htmlspecialchars($xml->heading) . "<br>";
echo "Body: " . htmlspecialchars($xml->body) . "<br>";
// 作为数组键访问属性
echo "Importance: " . htmlspecialchars($xml['importance']) . "<br>";
// 访问重复的元素(如 <tag>)
echo "Tags: ";
foreach ($xml->tags->tag as $tag) {
echo htmlspecialchars($tag) . " ";
}
echo "<br>";
}
} else {
echo "File not found: $xmlFile";
}
// 清除 libxml 错误
libxml_clear_errors();
?>

解释:

  1. libxml_use_internal_errors(true):告诉底层的 libxml 库抑制错误并将其内部存储,以便我们稍后获取。
  2. simplexml_load_file():解析 XML 文件,成功时返回一个 SimpleXMLElement 对象,失败时返回 false。
  3. 错误处理:我们检查 $xml 是否为 false。如果是,我们遍历 libxml_get_errors() 来显示解析错误。
  4. 访问元素:子元素像对象属性一样访问(例如,$xml->to,$xml->heading)。
  5. 访问属性:当前元素的属性像数组键一样访问(例如,$xml['importance'])。
  6. 访问重复的元素:当一个元素多次出现(如 <tag>)时,访问它(例如,$xml->tags->tag)会返回一个可迭代的 SimpleXMLElement 对象集合,可以使用 foreach 进行循环遍历。
  7. 安全性:将 XML 数据输出到 HTML 时,使用 htmlspecialchars() 以防止跨站脚本 (XSS) 漏洞。
  8. libxml_clear_errors():处理后清除所有存储的 libxml 错误。
  • DOMDocument: 当您需要更多控制时使用,例如大量修改 XML 结构、根据 DTD/Schema 进行验证或以复杂方式处理命名空间。
  • XMLReader: 用于处理极大的 XML 文件,此时将整个文档加载到内存中(像 SimpleXML 和 DOM 那样)是不可行的。它按顺序读取文件。
  • XML Parser (Expat): 一个低级、基于事件的解析器。也适用于非常大的文件或特定的流处理任务,但由于其基于回调的特性,实现通常更复杂。

对于许多典型的 Web 开发任务,例如从适中大小的 XML 文件中读取配置或数据,SimpleXML 在易用性和功能性之间提供了很好的平衡。

有关 SimpleXML 函数和方法的更多详细信息,请参考官方 PHP 文档。