java - 使用java中的Document删除xml中的节点

标签 java dom xml-parsing domdocument

我正在使用 org.w3c.dom.Document 进行 xml 解析。我的服务器中有一个 xml 文件,例如..

<query><item access='server1'><item access='server2'><item access='server3'></query>

我将读取此 xml 文件,并根据某些选项动态删除任何节点(server1 或 server2 或 server3)并将结果作为字符串返回,以便我可以在我的用户界面之一中显示。下面是代码

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setIgnoringComments(true);
inputStream = new FileInputStream(new File(filename));
org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(inputStream);
Element rootNode = doc.getDocumentElement();
if(filename.endsWith("items.xml"))//load the enabled items
{
    NodeList nList = doc.getElementsByTagName("item");
    for(int i = 0; i < nList.getLength(); i++)
    {
        try
        {
            Node node = nList.item(i);
            if((node.getNodeType() == Node.ELEMENT_NODE))
            {
                Element ele = (Element)node;
                String access = (String)ele.getAttribute("access");
                String level = access.substring(0,access.indexOf("."));

                if(!LevelManager.isLevelEnabled(level))
                {
                    rootNode.removeChild(node);
                }
            }
            else
            {
                System.out.println("NO ELEMENT NODE");
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
doc.normalize();
StringWriter stw = new StringWriter();
Transformer serializer = TransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"yes");
serializer.transform(new DOMSource(doc), new StreamResult(stw));
discfeatures = stw.toString();
return discfeatures;
}
catch(Exception w)
{
}

现在,问题是 ---> 有时节点不会被删除。例如,如果我删除 server1 属性节点 - 它会被删除。然后我再次尝试删除 server2 属性节点。它显示了不应该的 server1 节点。请告诉我我是否使用正确的方法删除节点。

谢谢

最佳答案

我刚刚意识到,在 for 循环中,一旦删除节点,xml 节点的总大小就会减少 1,并且 xml 结构会重新排列。因此它将进一步前进 1 个节点。 我将代码更改为

for(int i =0 ; i < nList.getLength();)
{
   //operation/

  //remove case match
   {
     //remove
     i=0;
     contiune;
   }
  i++
}

这对我有用!!!

关于java - 使用java中的Document删除xml中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411643/

相关文章:

java - "method stream() is undefined for the type Set<Person>"

java - 我们可以在单元测试中模拟finally block 吗

javascript - 你如何使 form.submit() 在 firefox 中工作?

javascript - 在设备方向更改期间隐藏 DOM 元素?

php - 它是一个简单的循环,但我不知道该怎么做

java - 如何选择颜色

java - 嵌套循环不会在长度大于 1 的内部循环中执行查询

Javascript:将 HTML 添加到字符串 - 创建链接并将其添加到输出

java - 如何动态生成实例名称?

java - getDocument() 不断返回空值