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

PHP DOMDocument 新增 XML 節點:建立、插入、屬性設定完整指南

     編輯:PHP 相關知識

現代 PHP 使用 DOMDocument 操作 XML,提供標準化、記憶體安全的節點建立與插入 API。本文示範如何載入現有 XML、定位目標父節點、建立新元素與屬性、插入到指定位置,並正確輸出格式化 XML。

範例 XML(contacts.xml)

<?xml version="1.0" encoding="UTF-8"?>
<contact id="43956">
  <personal>
    <name>
      <first>John</first>
      <middle>Q</middle>
      <last>Doe</last>
    </name>
    <title>Manager</title>
    <employer>National</employer>
    <dob>1971-12-22</dob>
  </personal>
</contact>

在 <personal> 節點下新增 <work> 子節點

<?php
$file = 'contacts.xml';

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false; // 忽略原文縮排空白
$dom->formatOutput = true;        // 輸出時自動縮排
$dom->load($file);

// 1. 定位目標父節點:用 XPath 更精準
$xpath = new DOMXPath($dom);
$personalNode = $xpath->query('/contact/personal')->item(0);

if (!$personalNode) {
    die("找不到  節點");
}

// 2. 建立新元素節點
$workNode = $dom->createElement('work', '6666'); // 直接設定文字內容

// 3. 新增屬性(可選)
$workNode->setAttribute('department', 'engineering');
$workNode->setAttribute('since', '2023-01-15');

// 4. 插入為  的最後一個子節點
$personalNode->appendChild($workNode);

// 5. 也可插入到特定位置:例如在  之後
// $titleNode = $xpath->query('/contact/personal/title')->item(0);
// $personalNode->insertBefore($workNode, $titleNode->nextSibling);

// 6. 輸出結果
header('Content-Type: application/xml; charset=UTF-8');
echo $dom->saveXML();

// 或存檔
// $dom->save($file);
?></code></pre>

<h2>輸出結果</h2>
<pre><code><?xml version="1.0" encoding="UTF-8"?>
<contact id="43956">
  <personal>
    <name>
      <first>John</first>
      <middle>Q</middle>
      <last>Doe</last>
    </name>
    <title>Manager</title>
    <employer>National</employer>
    <dob>1971-12-22</dob>
    <work department="engineering" since="2023-01-15">6666</work>
  </personal>
</contact></code></pre>

<h2>核心 DOM 節點操作方法速查</h2>
<table border="1" cellpadding="6" cellspacing="0">
  <tr><th>方法</th><th>說明</th><th>回傳值</th></tr>
  <tr><td><code>createElement($name, $value='')</code></td><td>建立元素節點,可選設定文字內容</td><td>DOMElement</td></tr>
  <tr><td><code>createTextNode($text)</code></td><td>建立純文字節點(會自動跳脫特殊字元)</td><td>DOMText</td></tr>
  <tr><td><code>createAttribute($name)</code></td><td>建立屬性節點</td><td>DOMAttr</td></tr>
  <tr><td><code>createCDATASection($data)</code></td><td>建立 CDATA 區塊</td><td>DOMCDATASection</td></tr>
  <tr><td><code>appendChild($node)</code></td><td>加入為最後一個子節點</td><td>插入的節點</td></tr>
  <tr><td><code>insertBefore($new, $ref)</code></td><td>在參考節點 $ref 之前插入 $new</td><td>插入的節點</td></tr>
  <tr><td><code>replaceChild($new, $old)</code></td><td>以 $new 取代 $old</td><td>被取代的舊節點</td></tr>
  <tr><td><code>removeChild($node)</code></td><td>移除子節點</td><td>被移除的節點</td></tr>
  <tr><td><code>cloneNode($deep=true)</code></td><td>複製節點(含子樹)</td><td>新節點</td></tr>
  <tr><td><code>setAttribute($name, $value)</code></td><td>直接設定元素屬性(便利方法)</td><td>void</td></tr>
</table>

<h2>進階:建立複雜結構(巢狀元素)</h2>
<pre><code><?php
// 建立 <address><city>Taipei</city><zip>100</zip></address>
$address = $dom->createElement('address');
$city = $dom->createElement('city', 'Taipei');
$zip = $dom->createElement('zip', '100');
$address->appendChild($city);
$address->appendChild($zip);

$personalNode->appendChild($address);
?></code></pre>

<h2>命名空間支援</h2>
<pre><code><?php
// 註冊命名空間
$nsUri = 'https://example.com/ns';
$dom->documentElement->setAttribute('xmlns:ex', $nsUri);

// 建立帶命名空間的元素
$exNode = $dom->createElementNS($nsUri, 'ex:customField', 'value');
$personalNode->appendChild($exNode);
?></code></pre>

<h2>常見錯誤避坑</h2>
<ol>
  <li><strong>跨文檔節點移動</strong>:節點屬於建立它的 DOMDocument。若要移動到另一個文檔,需用 <code>$targetDom->importNode($node, true)</code> 匯入。</li>
  <li><strong>格式化輸出失效</strong>:<code>formatOutput=true</code> 需配合 <code>preserveWhiteSpace=false</code>,且原 XML 不能有混合內容(元素夾雜文字)導致縮排異常。</li>
  <li><strong>特殊字元自動跳脫</strong>:用 <code>createTextNode()</code> 或 <code>createElement()</code> 設定文字時,<code><>&"</code> 會自動轉為實體,<strong>不要</strong> 自行 <code>htmlentities()</code> 重複編碼。</li>
  <li><strong>大檔案效能</strong>:DOM 會將整個文檔載入記憶體。超大 XML 請改用 <strong>XMLWriter</strong> 串流寫入。</li>
</ol>

<h2>XMLWriter 串流寫入範例(大檔案/高效能)</h2>
<pre><code><?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument('1.0', 'UTF-8');
$writer->startElement('contacts');
// ... 迴圈寫入大量資料 ...
$writer->endElement();
$writer->endDocument();
file_put_contents('output.xml', $writer->outputMemory());
?></code></pre>

<p>掌握 DOMDocument 節點增刪改查,是處理 XML 設定檔、資料交換、RSS/Atom 產生、SVG 操作等場景的核心技能。</p>
							<div class="qcxs_ie_he"></div>
						</div>
						<div class="akevx_own"> <script language='javascript' src='/ad/p.js'></script></div>
						<div class="akevx_mj"> </div>	
						<div class="qcxs_ie_he"></div>
						
						<ol class="qmsbvx_hsb ovv_hex">
							<li>上一篇文章: <a class='LinkPrevArticle' href='https://code.yunyiwangluo.com/bianchen/gyphp/41127.html' >PHP 遍歷 XML 文件所有節點:DOMDocument 現代化實作</a> <li>下一篇文章: <a class='LinkNextArticle' href='https://code.yunyiwangluo.com/bianchen/gyphp/41129.html'  >PHP ZipArchive 完整操作指南:建立、讀取、新增、刪除、解壓縮與加密</a> 
						</ol>
					</div>
				</div>
				<div class="qirnxbd bg1 mt20">
					<div class="jdbsbav">
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/' target="_blank">PHP 相關知識</a>
						<div class="jdbsbav_hx"></div>
					</div>
					<div class="qirnxbd_rbx">
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/140787.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011617530406_S.jpg'  width='100' height='70' alt='Windows 64 位元系統安裝 Redis 完整圖文教程(含常見錯誤排除)'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/140787.html' target="_blank"><strong>Windows 64 位元系統安裝 Redis 完整圖文教程(含常見錯誤排除)</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/140787.html' target="_blank"><p>前言:什麼是 Redis?
Redis 是一個開源、使用 A</p></a>			
						</div>
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/146473.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011711314138.png'  width='100' height='70' alt='深入理解 PHP SAPI 生命週期:從啟動到關閉的完整流程'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/146473.html' target="_blank"><strong>深入理解 PHP SAPI 生命週期:從啟動到關閉的完整流程</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/146473.html' target="_blank"><p>前言
使用 PHP 開發多年,卻只知其表不知其裡。本文系統整</p></a>			
						</div>
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/139402.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017011617005133.png'  width='100' height='70' alt='PHP 解壓 tar.gz 文件三大方案:PharData、Archive_Tar 與系統命令對比'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/139402.html' target="_blank"><strong>PHP 解壓 tar.gz 文件三大方案:PharData、Archive_Tar 與系統命令對比</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/139402.html' target="_blank"><p>PHP 解壓 tar.gz 文件三大方案:PharData、</p></a>			
						</div>
						
						<div class="oiendx">
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/42365.html' target="_blank"><img  src='https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017010910215612.png'  width='100' height='70' alt='Nginx + PHP-FPM 完整部署指南:從安裝、配置到高併發優化'  border='0'></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/42365.html' target="_blank"><strong>Nginx + PHP-FPM 完整部署指南:從安裝、配置到高併發優化</strong></a>
							<a href='https://code.yunyiwangluo.com/bianchen/gyphp/42365.html' target="_blank"><p>Nginx 搭配 PHP-FPM 是現代 PHP 高效能部署</p></a>			
						</div>
						
						<div class="qcxs_ie_he"></div>
					</div>
				</div>
			</div>
			<div class="eccsgxsg mt20">
				
				<div class="akevx_oin"> </div>	
				<div class="nenxnxb bg1 mt20">
					<div class="enxvsfgg">
						<div class="enxvsfgg_1"></div>
					</div>
					<div class="pdirbvx lbhevs ovv_hex">
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/140289.html' target="_blank">OpenStack qcow2 鏡像製作實戰:Linux/Windows 全流程指令碼化指南</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/42982.html' target="_blank">如何高效閱讀 PHP 開源專案源碼:七步分析法與實戰心法</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/155530.html' target="_blank">PHP 獲取遠端圖片並儲存至本地的多種方法總整理</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/145708.html' target="_blank">PHP 正則過濾 JS 腳本:正確匹配多行 `<script>` 標籤</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/144527.html' target="_blank">Discuz DB 跨庫表前綴映射修復後引發的新 Bug 分析</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/152089.html' target="_blank">PHP 常數定義與使用全攻略:define、const、魔術常數與最佳實踐</a>
						
						<a href='https://code.yunyiwangluo.com/bianchen/gyphp/158007.html' target="_blank">PHP Web 開發基礎:文件包含、黏性表單、日期時間處理與郵件發送</a>
						
					</div>
				</div>
			
				<div class="eqibneb bg1 mt20">
					<div class="lkebxsg">欄目導航</div>
					<div class="eqibneb_1 ovv_hex">
						<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/phpjc/' target="_self">PHP 基礎</a></li>
<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/phpzh/' target="_self">PHP 綜合知識</a></li>
<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/phprm/' target="_self">PHP 入門</a></li>
<li><a class='childclass' href='https://code.yunyiwangluo.com/bianchen/gyphp/' target="_self">PHP 相關知識</a></li>
					</div>
					
				</div>
			</div>
			<div class="qcxs_ie_he"></div>
		</div>
	</div>
		<div class="qcxs_ie_he"></div>
	<div class="ebrxbsbf">Copyright © <a href="https://code.yunyiwangluo.com/" target="_blank" title="程式碼之家">程式碼之家</a> All Rights Reserved   </div>


</body>
</html>