現有 stu.xml 存儲學生姓名及三科成績,需遍歷每個 <xuesheng> 節點,計算語文、數學、英語總分,並以 <zongfen> 子節點形式追加保存回文件。
<?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
$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 更新完成。";
?>
<xuesheng>
<name>張三</name>
<yuwen>80</yuwen>
<shuxue>90</shuxue>
<yingyu>70</yingyu>
<zongfen>240</zongfen>
</xuesheng>
DOMDocument 支持節點增刪改、格式化輸出,適合「讀取-修改-寫回」場景;SimpleXML 僅適合只讀遍歷。zongfen 是否已存在,避免重複運行導致節點疊加。(int) 強制轉換防止字符串拼接(如 '80'+'90'='8090')。$doc->formatOutput = true 保持 XML 縮進可讀。$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);