You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java修改XML问题:Activity A04的PlannedDuration未写入文件

问题排查:XML修改后未同步到文件的原因及修复方案

你遇到的问题是修改XML中Id为A04的Activity的PlannedDuration值后,看不到文件变更效果,我帮你排查了代码里的几个关键问题,这应该就是修改没生效的核心原因:

主要问题点

  • 错误的输出文件路径:
    在你的代码中,保存修改后XML的代码是:

    StreamResult result = new StreamResult(new File("xmlfile"));
    

    这里的"xmlfile"是相对路径,会在你的Java项目根目录下生成一个名为xmlfile的新文件,而不是覆盖你原本要修改的C:/Users/dianitaf/Downloads/xml Files/CS_1.xml。所以你修改的内容其实已经生效,但写到了一个你没关注的文件里。

  • 冗余的代码操作:

    • 你在调用updateElementValue之后又调用了一次document.getDocumentElement().normalize();,这步操作是多余的,因为在解析文件后已经执行过一次normalize,修改节点内容后不需要重复执行。
    • 代码中有一行act.getElementsByTagName("PlannedDuration").item(0).getTextContent();没有任何实际作用,只是获取了值但没有使用,可以直接删除。

修正后的完整代码

package modifyXML;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class ModifyXML{
 public static void main(String[] args) {
 File xmlfile = new File("C:/Users/dianitaf/Downloads/xml Files/CS_1.xml");
 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder dBuilder;
 try {
 dBuilder = dbFactory.newDocumentBuilder();
 Document document = dBuilder.parse(xmlfile);
 document.getDocumentElement().normalize();
 updateElementValue(document,"Id", "A04");
 TransformerFactory transformerFactory = TransformerFactory.newInstance();
 Transformer transformer = transformerFactory.newTransformer();
 // 可选:设置输出格式,让XML更易读
 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
 DOMSource source = new DOMSource(document);
 // 改为使用原文件路径,覆盖原文件;若不想覆盖可指定新的完整路径
 StreamResult result = new StreamResult(xmlfile);
 transformer.transform(source, result);
 System.out.println("XML file updated successfully");
 } catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) {
 e1.printStackTrace();
 }
 }
 private static void updateElementValue(Document document, String textNodeName, String textNodeValue) {
 NodeList Activity = document.getElementsByTagName("Activity");
 //loop for each activity
 for(int i=0; i<Activity.getLength();i++){
 Node activityNode = Activity.item(i);
 if(activityNode.getNodeType() == Node.ELEMENT_NODE) {
 Element activityElement = (Element) activityNode;
 NodeList textNodes = activityElement.getElementsByTagName(textNodeName);
 if(textNodes.getLength() > 0) {
 if(textNodes.item(0).getTextContent().equalsIgnoreCase(textNodeValue)) {
 System.out.println(textNodes.item(0).getTextContent());
 System.out.println(activityElement.getElementsByTagName("Name").item(0).getTextContent());
 Element act = (Element) Activity.item(i);
 // 简化PlannedDuration的修改逻辑
 Element plannedDurationEle = (Element) act.getElementsByTagName("PlannedDuration").item(0);
 System.out.println("Initial Duration : " + plannedDurationEle.getTextContent());
 plannedDurationEle.setTextContent("25");
 System.out.println("Updated Duration : " + plannedDurationEle.getTextContent());
 }
 }
 }
 }
 }
}

额外优化说明

  1. 添加了XML输出格式化配置,让修改后的XML文件结构更清晰,这一步是可选的,但方便后续查看内容。
  2. 简化了PlannedDuration节点的修改逻辑:不需要额外获取getFirstChild(),直接调用元素的setTextContent()即可覆盖内部的文本节点值,代码更简洁。

这样修改后,你的修改内容就会正确同步到原XML文件中,打开文件就能看到PlannedDuration的值从16变为25了。

内容的提问来源于stack exchange,提问作者Diana M. Franco Duran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:53:24