首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP XML DOM 操作進階(下):創建、修改、刪除節點、屬性增刪改、保存、SimpleXML 對比、最佳實踐

     編輯:PHP 相關知識

DOM 寫操作全集:創建節點、修改內容、刪除遷移、序列化輸出、編碼處理

接上篇,掌握寫操作即可構建完整 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);
}

屬性增刪改查 (CRUD)

$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();

編碼處理關鍵

  • 構造函數指定 `UTF-8`,內部統一 UTF-8。
  • 輸出時 `saveXML()` 返回 UTF-8 字符串。
  • 若需 GBK/Big5,用 `iconv('UTF-8', 'GBK//IGNORE', $xmlString)` 轉換。
  • HTML 模式 `loadHTML()` 默認 Latin1,需 `` 或 `mb_convert_encoding` 預處理。

SimpleXML 對比:何時用哪個?

**選型**:需修改結構/屬性/生成 XML → **DOM**;僅讀取/遍歷簡單 XML → **SimpleXML**。

最佳實踐清單

  1. 始終啟用 `$dom->formatOutput = true` 便於調試。
  2. 跨文檔移動節點**必須** `importNode($node, true)`。
  3. XPath 查詢註冊所有用到的命名空間前綴。
  4. 大文件用 `XMLReader` + `expand()` 逐塊處理。
  5. 錯誤處理:`libxml_use_internal_errors(true)` + `libxml_get_errors()`。
  6. HTML 解析優先用 `DOMDocument::loadHTML()`,非標準 HTML 容錯性強。
  7. 序列化前驗證:`$dom->schemaValidate('schema.xsd')` (可選)。

掌握 DOM 讀寫,XML/HTML 處理無懼任何複雜需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性DOMDocumentSimpleXML
寫操作完整 (增刪改)極弱 (僅修改值/屬性)
XPath原生支援支援 (xpath())
命名空間完整支援較繁瑣
大文件配合 XMLReader不支援流式
易用性較繁瑣極簡 (屬性訪問)
內存較高略低