我有一个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);
}
}
答案 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
元素。