yeyerl 2012-11-21 23:10 采纳率: 50%
浏览 237
已采纳

java用dom更新xml的问题,怎么在子节点下添加节点?

有原始xml如下:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <students>
   <student>
     <name sn="03" sn2="0322"/>
   </student>
 </students>

 我想要得到修改后的结果为:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <students>
   <student>
     <name sn="03" sn2="0322"/>
     <name sn="04" sn2="0422"/>
   </student>
 </students>

 我的代码为:

 

public static void main(String[] args) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse("D:/students.xml");
            Element eltName = doc.createElement("name");
             
            Attr attr = doc.createAttribute("sn");
            attr.setValue("04");
            Attr attr2 = doc.createAttribute("sn2");
            attr2.setValue("0422");
             
            eltName.setAttributeNode(attr);
            eltName.setAttributeNode(attr2);
 
            Element eltRoot=doc.getDocumentElement();
            eltRoot.appendChild(eltName);
            doc2XmlFile(doc, "D:/students.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
/**
     * 将Document对象修改后写入到xml里面
     * @param document Document对象
     * @param filename xml文件路径
     * @return
     */
    public boolean doc2XmlFile(Document document, String filename) {
        boolean flag = true;
        try {
            /** 将document中的内容写入文件中 */
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            /** 编码 */
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new File(filename));
            transformer.transform(source, result);
        } catch (Exception ex) {
            flag = false;
            System.out.println("更新" + filename + "出错:" + ex);
            log.error("更新" + filename + "出错:" + ex);
            ex.printStackTrace();
        }
        return flag;
    }

 这样得到的结果为:

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  <students>
    <student>
      <name sn="03" sn2="0322"/>
    </student>
    <name sn="04" sn2="0422"/>
  </students>

 弄了一天了也没能把添加的name节点放到student节点下面,请教各位大侠了!

 

 

 

 

  • 写回答

3条回答 默认 最新

  • blogzhoubo 2012-11-22 09:16
    关注

    还有一种更好的方法,不需要修改xml文件,

    [code="js"]Element eltRoot=doc.getDocumentElement();

    eltRoot.appendChild(eltName);[/code]

    改成:

    [code="js"]Node stNode = doc.getElementsByTagName("student").item(0);
    stNode.appendChild(eltName);[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 在codeblocks里主函数运行到打印生成的链表就结束了 没有再往下是为什么呢
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合