无法使用Java从xml中有条件地删除

时间:2016-02-23 12:23:31

标签: java xml

我有一个xml文件,我需要删除某些元素,具体取决于属性值。无条件删除工作正常,但不会:

NodeList nodes = doc.getElementsByTagName("host");
           Element d;
          for ( int i = 0; i < nodes.getLength(); i++ ) { 
           String state = nodes.item(i).getChildNodes().item(0).getAttributes().item(0).getTextContent();
           if("down".equals(state)){
              d= (Element) nodes.item(0);
             d.getParentNode().removeChild(d);
              System.out.println(state);
           } 
           }

1 个答案:

答案 0 :(得分:0)

代码存在一些问题。第一个是行

String state = nodes.item(i).getChildNodes().item(0).getAttributes().item(0).getTextContent();

假设1)子元素之间没有文本节点,2)所查找的属性始终是列表中的第一个属性。如果输入文档的格式发生变化,这会使代码变得脆弱并且会失败。

第二个问题是,在迭代节点列表时,列表的某些成员将从其父节点中删除。如果在DOM API中未指定从父项中删除/删除子项的列表行为,为什么效果可能因实现而异。不确定这是否是这种情况,但我不会依赖猜测。

我建议使用XPath(更清晰,更短)。像这样:

    XPath xp = XPathFactory.newInstance().newXPath();
    NodeList list = (NodeList) xp.evaluate("//node[*[@* = 'down']]", doc, XPathConstants.NODESET);
    for(int i=0; i < list.getLength(); ++i) {
        Node node = list.item(i);
        node.getParentNode().removeChild(node);
    }

表达式//node[*[@* = 'down']]选择具有包含值<node>的任何属性的子元素的所有down元素。