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

PHP DOMDocument 操作 XML:為學生節點新增總分屬性

     編輯:PHP 綜合知識

需求背景

現有 stu.xml 存儲學生姓名及三科成績,需遍歷每個 <xuesheng> 節點,計算語文、數學、英語總分,並以 <zongfen> 子節點形式追加保存回文件。

原始 XML (stu.xml)

<?xml version="1.0" encoding="utf-8"?>
<AllData>
  <xueshengmen>
    <xuesheng>
      <name>張三</name>
      <yuwen>80</yuwen>
      <shuxue>90</shuxue>
      <yingyu>70</yingyu>
    </xuesheng>
    <xuesheng>
      <name>李四</name>
      <yuwen>60</yuwen>
      <shuxue>90</shuxue>
      <yingyu>75</yingyu>
    </xuesheng>
  </xueshengmen>
</AllData>

PHP 實現代碼

<?php
$file = 'stu.xml';
$doc  = new DOMDocument();
$doc->load($file);

// 獲取所有學生節點
$students = $doc->getElementsByTagName('xuesheng');

foreach ($students as $stu) {
    // 讀取三科分數
    $yuwen  = (int)$stu->getElementsByTagName('yuwen')->item(0)->nodeValue;
    $shuxue = (int)$stu->getElementsByTagName('shuxue')->item(0)->nodeValue;
    $yingyu = (int)$stu->getElementsByTagName('yingyu')->item(0)->nodeValue;

    // 已存在總分則跳過(冪等性)
    if ($stu->getElementsByTagName('zongfen')->length) {
        continue;
    }

    $zongfen = $yuwen + $shuxue + $yingyu;
    $newNode = $doc->createElement('zongfen', $zongfen);
    $stu->appendChild($newNode);
}

// 保存回文件(保留格式化)
$doc->formatOutput = true;
$doc->save($file);
echo "XML 更新完成。";
?>

執行後 XML 片段

    <xuesheng>
      <name>張三</name>
      <yuwen>80</yuwen>
      <shuxue>90</shuxue>
      <yingyu>70</yingyu>
      <zongfen>240</zongfen>
    </xuesheng>

技術要點

  1. DOMDocument vs SimpleXML:DOMDocument 支持節點增刪改、格式化輸出,適合「讀取-修改-寫回」場景;SimpleXML 僅適合只讀遍歷。
  2. 冪等性:判斷 zongfen 是否已存在,避免重複運行導致節點疊加。
  3. 類型轉換:(int) 強制轉換防止字符串拼接(如 '80'+'90'='8090')。
  4. 格式化輸出:$doc->formatOutput = true 保持 XML 縮進可讀。

擴展:批量導出 JSON/數組

$arr = [];
foreach ($students as $stu) {
    $arr[] = [
        'name'    => $stu->getElementsByTagName('name')->item(0)->nodeValue,
        'yuwen'   => (int)$stu->getElementsByTagName('yuwen')->item(0)->nodeValue,
        'shuxue'  => (int)$stu->getElementsByTagName('shuxue')->item(0)->nodeValue,
        'yingyu'  => (int)$stu->getElementsByTagName('yingyu')->item(0)->nodeValue,
        'zongfen' => (int)$stu->getElementsByTagName('zongfen')->item(0)->nodeValue,
    ];
}
echo json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved