can';t使用Java有条件地从xml中删除

can';t使用Java有条件地从xml中删除,java,xml,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).getAttrib

我有一个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);
           } 
           }
NodeList nodes=doc.getElementsByTagName(“主机”);
元素d;
对于(inti=0;i
该代码有几个问题。第一条是线路

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);
    }
XPathXP=XPathFactory.newInstance().newXPath();
NodeList list=(NodeList)xp.evaluate(“//node[*[@*='down']]”,doc,XPathConstants.NODESET);
对于(int i=0;i

表达式
//node[*[@*='down']]
选择所有
元素,这些元素的子元素具有任何值
down

的属性。当您说它不工作时,效果如何?没有删除?异常?一次只删除满足条件的部分元素。事实证明,我必须运行程序几次,它才能删除所有需要删除的元素!!XML的(简化)结构是什么?具有
向下
值的属性的名称是什么?你确定它总是列表中的第一个吗?是的,我确定,我做了一些检查,结果它没有通过洞循环,可能是因为它包含了60000多个项目。这一行没有找到我打印的任何元素,它总是0:(NodeList)xp.evaluate(//node[@='down']],doc,pathcontents.NODESET);好的,只是用主机替换节点