PHP中的XML处理:开发者完整指南
XML(可扩展标记语言)仍然是数据交换、应用程序配置以及与外部服务集成的关键格式之一。PHP提供了多种强大的XML处理工具,每种工具适用于不同的场景。本文将详细解析现代PHP开发中常用的主要库和方法。
PHP处理XML的主要工具
PHP中有三个主要的XML处理扩展,每个都有其特点和适用领域:
- SimpleXML — 简单直观的XML读取解析器。非常适合小文件和快速处理。
- DOMDocument — 用于处理XML文档的完整W3C DOM实现。支持读取、写入、修改和验证。
- XMLReader / XMLWriter — 用于处理大型XML文件(数百兆字节到千兆字节)的流式解析器。
1. SimpleXML — 快速入门
SimpleXML可以将XML字符串或文件转换为对象,您可以像操作普通数组或对象一样操作它。这是简单任务中最流行的选择。
<?php// 从字符串读取XML$xmlString = '<books> <book id="1"> <title>PHP入门</title> <author>伊万·彼得罗夫</author> <price currency="RUB">1500</price> </book> <book id="2"> <title>XML详解</title> <author>安娜·斯米尔诺娃</author> <price currency="RUB">2000</price> </book></books>';
$xml = simplexml_load_string($xmlString);
// 访问数据foreach ($xml->book as $book) { echo "ID: " . $book['id'] . ""; echo "书名: " . $book->title . ""; echo "作者: " . $book->author . ""; echo "价格: " . $book->price . " " . $book->price['currency'] . "
";}
// 创建新的XML$newXml = new SimpleXMLElement('<catalog/>');$product = $newXml->addChild('product');$product->addAttribute('sku', 'P001');$product->addChild('name', '笔记本电脑');$product->addChild('price', 55000);
echo $newXml->asXML();?>2. DOMDocument — 完全控制
DOMDocument提供对文档对象模型的完全访问。您可以创建、修改和删除任何节点,还可以执行XPath查询来搜索数据。
<?php$dom = new DOMDocument('1.0', 'UTF-8');$dom->formatOutput = true;
// 创建根元素$root = $dom->createElement('employees');$dom->appendChild($root);
// 添加员工$employee = $dom->createElement('employee');$employee->setAttribute('id', '101');
$name = $dom->createElement('name', '阿列克谢·库兹涅佐夫');$employee->appendChild($name);
$position = $dom->createElement('position', '开发人员');$employee->appendChild($position);
$root->appendChild($employee);
// XPath查询$xpath = new DOMXPath($dom);$query = "//employee[@id='101']/name";$result = $xpath->query($query);
if ($result->length > 0) { echo "找到: " . $result->item(0)->nodeValue;}
// 保存到文件$dom->save('employees.xml');?>3. XMLReader和XMLWriter — 处理大数据
当XML文件太大而无法加载到内存中(超过10-50 MB)时,流式解析器就派上用场了。XMLReader逐个节点读取文档,而XMLWriter则逐部分创建XML。
<?php// 读取大型XML文件$reader = new XMLReader();$reader->open('large_data.xml');
while ($reader->read(