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()); } } } } } }
额外优化说明
- 添加了XML输出格式化配置,让修改后的XML文件结构更清晰,这一步是可选的,但方便后续查看内容。
- 简化了PlannedDuration节点的修改逻辑:不需要额外获取
getFirstChild(),直接调用元素的setTextContent()即可覆盖内部的文本节点值,代码更简洁。
这样修改后,你的修改内容就会正确同步到原XML文件中,打开文件就能看到PlannedDuration的值从16变为25了。
内容的提问来源于stack exchange,提问作者Diana M. Franco Duran
相关产品推荐
相关产品推荐

