PHP中的XML处理:从简单解析到创建复杂文档
XML(可扩展标记语言)仍然是数据交换、配置文件以及Web服务(SOAP、RSS/Atom)的关键格式之一。PHP提供了几个强大的内置扩展用于处理XML,能够解决几乎任何任务——从解析简单的RSS源到生成带有命名空间的复杂文档。在本文中,我们将介绍主要工具:SimpleXML、DOMDocument和XMLReader,并学习如何动态创建XML文档。
1. SimpleXML — 快速便捷的解析
SimpleXML是最简单的XML处理扩展。它将XML文档转换为一个对象,其属性可以像普通数组和对象一样读取。非常适合中小型文档,当不需要复杂导航时。
从字符串或文件加载XML
<?php// 从字符串$xmlString = '<book><title>PHP入门</title><author>伊万·彼得罗夫</author></book>';$book = simplexml_load_string($xmlString);
// 从文件$books = simplexml_load_file('books.xml');
echo $book->title; // PHP入门echo $book->author; // 伊万·彼得罗夫?>处理属性和多个元素
<?php$xml = '<library> <book id="1"> <title>PHP Objects</title> <author>Matt Zandstra</author> </book> <book id="2"> <title>Clean Code</title> <author>Robert C. Martin</author> </book></library>';
$library = simplexml_load_string($xml);
foreach ($library->book as $book) { echo 'ID: ' . $book['id'] . ' — ' . $book->title . ' (' . $book->author . ')<br>';}// ID: 1 — PHP Objects (Matt Zandstra)// ID: 2 — Clean Code (Robert C. Martin)?>重要提示: SimpleXML不支持带有条件的复杂XPath查询(仅支持简单路径)。对于更强大的查询,请使用DOMDocument或XPath。
2. DOMDocument — 对XML的完全控制
DOMDocument实现了W3C DOM API,并提供了对文档结构的完全控制。您可以添加、删除、修改任何节点,处理命名空间,并执行任意复杂度的XPath查询。这是专业任务的选择。
使用DOMDocument进行解析和导航
<?php$dom = new DOMDocument();$dom->load('books.xml');
// 获取所有<book>元素$books = $dom->getElementsByTagName('book');
foreach ($books as $book) { $title = $book->getElementsByTagName('title')->item(0)->nodeValue; $author = $book->getElementsByTagName('author')->item(0)->nodeValue; echo "书籍:$title, 作者:$author<br>";}?>XPath — 对XML的强大查询
<?php$dom = new DOMDocument();$dom->load('library.xml');$xpath = new DOMXPath($dom);
// 查找所有价格 > 500 的书籍$expensiveBooks = $xpath->query('//book[price > 500]');
foreach ($expensiveBooks as $book) { echo $book->getElementsByTagName('title')->item(0)->nodeValue . ' — ' . $book->getElementsByTagName('price')->item(0)->nodeValue . ' 卢布<br>';}?>3. 创建XML文档
PHP不仅可以读取,还可以创建XML文档。我们来介绍两种方法。
通过SimpleXML创建XML
<?php$xml = new SimpleXMLElement('<catalog></catalog>');
$product = $xml->addChild('product');$product->addChild('name', '笔记本电脑');$product->addChild('price', 75000);$product->addAttribute('id', '12