PHP中的XML处理:DOMDocument、SimpleXML和XPath
XML(可扩展标记语言)仍然是数据交换、配置存储以及与外部服务(RSS订阅、SOAP、API)集成的关键格式之一。PHP提供了几个强大的内置扩展用于处理XML。在本文中,我们将介绍三种主要方法:DOMDocument(文档对象模型)、SimpleXML(简单直观)和XPath(用于导航的查询语言)。
1. 准备工作:XML文档示例
所有示例将使用同一个XML文件 catalog.xml:
<?xml version="1.0" encoding="UTF-8"?><catalog> <book id="1"> <title>PHP入门指南</title> <author>伊万·彼得罗夫</author> <price currency="RUB">1200</price> </book> <book id="2"> <title>XML详解</title> <author>玛丽亚·西多罗娃</author> <price currency="RUB">950</price> </book></catalog>2. DOMDocument — 对XML的完全控制
DOMDocument扩展实现了W3C DOM Level 2标准。它提供了最大程度的控制:可以创建、删除、修改任何节点、属性和文本内容。适用于需要精确控制结构的复杂场景。
加载和读取XML
<?php$dom = new DOMDocument();$dom->load('catalog.xml'); // 或 loadXML($xmlString)
$books = $dom->getElementsByTagName('book');foreach ($books as $book) { $id = $book->getAttribute('id'); $title = $book->getElementsByTagName('title')->item(0)->nodeValue; $author = $book->getElementsByTagName('author')->item(0)->nodeValue; $price = $book->getElementsByTagName('price')->item(0)->nodeValue; echo "图书 #$id: $title — $author, $price 卢布";}?>创建新的XML
<?php$dom = new DOMDocument('1.0', 'UTF-8');$root = $dom->createElement('catalog');$dom->appendChild($root);
$book = $dom->createElement('book');$book->setAttribute('id', '3');$title = $dom->createElement('title', 'PHP与XML');$book->appendChild($title);$root->appendChild($book);
echo $dom->saveXML(); // 输出XML字符串// $dom->save('new_catalog.xml');?>3. SimpleXML — 简单与便捷
SimpleXML是一个更轻量的扩展,它将XML转换为对象,通过属性访问元素。非常适合快速读取,特别是当XML结构已知且不需要精细调整时。
使用SimpleXML读取XML
<?php$xml = simplexml_load_file('catalog.xml'); // 或 simplexml_load_string($xmlString)
foreach ($xml->book as $book) { $id = (string)$book['id']; $title = (string)$book->title; $author = (string)$book->author; $price = (string)$book->price; echo "图书 #$id: $title — $author, $price 卢布";}?>通过SimpleXML创建XML
<?php$xml = new SimpleXMLElement('<catalog></catalog>');$book = $xml->addChild('book');$book->addAttribute('id', '4');$book->addChild('title', 'SimpleXML指南');$book->addChild('price', 800)->addAttribute('currency', 'RUB');
echo $xml->asXML();// $xml->asXML('output.xml');?>修改数据
<?php$xml = simplexml_load_file('catalog.xml');$xml->book[0]->price = 1300; // 修改第一本书的价格$xml->asXML('catalog_updated.xml');?>