接上篇,掌握寫操作即可構建完整 XML 生成/修改流程。
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // 縮進輸出
// 1. 創建元素節點
$root = $dom->createElement('catalog');
$dom->appendChild($root);
// 2. 創建帶文本的元素
$book = $dom->createElement('book', 'PHP Mastery'); // 文本內容
$book->setAttribute('id', 'bk101');
$root->appendChild($book);
// 3. 創建子元素並追加
$author = $dom->createElement('author', 'John Doe');
$book->appendChild($author);
// 4. 創建屬性節點 (較少用,通常用 setAttribute)
$attr = $dom->createAttribute('isbn');
$attr->value = '978-7-111-12345-6';
$book->appendChild($attr);
// 5. 創建 CDATA 區塊
$desc = $dom->createElement('description');
$cdata = $dom->createCDATASection('Contains & "special" chars');
$desc->appendChild($cdata);
$book->appendChild($desc);
// 6. 創建註釋
$comment = $dom->createComment('Generated at ' . date('c'));
$root->appendChild($comment);
// 1. 修改文本內容
$book->getElementsByTagName('author')->item(0)->nodeValue = 'Jane Smith';
// 2. 替換整個節點
$newBook = $dom->createElement('book', 'New Title');
$newBook->setAttribute('id', 'bk102');
$root->replaceChild($newBook, $book); // $book 被移除
// 3. 遷移節點 (跨文檔需 importNode)
$otherDom = new DOMDocument();
$otherDom->loadXML('Imported ');
$imported = $dom->importNode($otherDom->documentElement, true); // true=深度複製
$root->appendChild($imported);
// 1. 刪除子節點
$book->removeChild($book->getElementsByTagName('author')->item(0));
// 2. 刪除自身 (需父節點調用)
$root->removeChild($book);
// 3. 清空所有子節點
while ($root->firstChild) {
$root->removeChild($root->firstChild);
}
$elem = $dom->createElement('item');
// 增/改
$elem->setAttribute('price', '29.99');
$elem->setAttribute('currency', 'CNY');
// 查
$price = $elem->getAttribute('price'); // '29.99'
$hasCur = $elem->hasAttribute('currency'); // true
// 刪
$elem->removeAttribute('currency');
// 1. 保存文件
$dom->save('output.xml'); // 返回寫入字節數
// 2. 獲取字符串
$xmlString = $dom->saveXML(); // 整個文檔
$bookXml = $dom->saveXML($book); // 單節點及子樹
// 3. 直接輸出 HTTP 響應
header('Content-Type: application/xml; charset=UTF-8');
echo $dom->saveXML();
| 特性 | DOMDocument | SimpleXML |
|---|---|---|
| 寫操作 | 完整 (增刪改) | 極弱 (僅修改值/屬性) |
| XPath | 原生支援 | 支援 (xpath()) |
| 命名空間 | 完整支援 | 較繁瑣 |
| 大文件 | 配合 XMLReader | 不支援流式 |
| 易用性 | 較繁瑣 | 極簡 (屬性訪問) |
| 內存 | 較高 | 略低 |