首页新闻找找看学习计划

java中使用DOM删除xml文件中的元素时的问题?

0
悬赏园豆:30 [已解决问题] 解决于 2019-01-05 18:33
  • 在学习java的DOM解析的时候,发现一个问题,就是在使用循环的方式使用removeChild()这个方法删除元素,发现只能够删除第一个元素,其他同名称的元素无法删除?百度谷歌也没找到答案,特来请教各位大神,如有老师肯指教,感激不尽.

    具体问题如下

  • 原xml文件内容
<?xml version="1.0" encoding="utf-8"?>
<shop>
    <pen>
        <type>钢笔</type>
        <manufacturers id="9567">长城牌</manufacturers>
        <tradePrice>0.5</tradePrice>
        
    </pen>
    <book>
        <name>新的世界,新的你</name>
        <year>3</year>
        <price >56.6</price>
    </book>
    <book>
        <name>java入门到跑路</name>
        <year>111</year>
        <price >100</price>
    </book>
</shop>

删除所有同名称的元素

  • 例如,删除xml文件中所有<year>元素
    • 使用DocumentBuilder类将xml文件读取到内存中,形成dom树
          //使用DocumentBuilder解析原xml文件,将xml文件中的数据加载到内存中,形成DOM树
          DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
          DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
          File xmlFile = new File("e:"+ File.separator+"testWeb"+File.separator+"info.xml");
          Document xmlDoc = docBuilder.parse(xmlFile);
  • 找到DOM树中所有"year"元素节点
        //得到要修改的元素节点
        NodeList yearElements = xmlDoc.getElementsByTagName("year");
  • 循环删除每个"year"元素节点
        //修改xml元素
        //得到要修改的元素节点
        for (int i = 0; i < yearElements.getLength(); i++) {
            //找到当前"year"元素节点的父节点,然后使用父节点删除所有"year"子节点
            Node temp = yearElements.item(i);
            temp.getParentNode().removeChild(temp);
        }
  • 删除元素之后,要将当前的DOM树结构,覆盖掉原来的xml文件的DOM树
    • 要将DOM树从内存中输出到文件,需要用的是Transformer类进行操作
    
          //将修改后的DOM树,覆盖到原xml文件中
          TransformerFactory tfFactory = TransformerFactory.newInstance();
          Transformer transformer = tfFactory.newTransformer();
          transformer.transform(new DOMSource(xmlDoc),new StreamResult(xmlFile));
  • 运行结果正常.
  • 查看源文件

在这里插入图片描述

青椒盖饭的主页 青椒盖饭 | 初学一级 | 园豆:175
提问于:2019-01-03 10:58
< >
分享
最佳答案
0

//修改xml元素
//得到要修改的元素节点
for (int i = 0; i < yearElements.getLength(); i++) {
//找到当前"year"元素节点的父节点,然后使用父节点删除所有"year"子节点
Node temp = yearElements.item(i);
temp.getParentNode().removeChild(temp);
}
debug上面的代码,我觉得可以for (int i = 0, length = yearElements.getLength(); i < length; i++)
怀疑删除year时可能yearElements的长度变了

收获园豆:30
流年飞雨 | 小虾三级 |园豆:1928 | 2019-01-04 16:36

嗯嗯,没错,每次删除元素的时候,yearElements集合中的内容会发生变化

青椒盖饭 | 园豆:175 (初学一级) | 2019-01-05 18:32

多谢指教

青椒盖饭 | 园豆:175 (初学一级) | 2019-01-05 18:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册