2013-03-14 92 views
0

我'使用org.w3c.dom.Document中的XML parsing.I在我的服务器就像一个xml文件..在Java中使用文档中删除XML中的节点

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

我会读这个XML基于文件和一些选项的,我会动态地消除任何一个节点(服务器或服务器2 server(服务器)或)和返回结果为一个字符串,这样我可以在我的用户interface.below的一个表现是代码

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属性node.it显示server1节点should'nt.Please让我知道如果我使用正确的方式删除节点。

由于

回答

1

我只是意识到的是,在for循环中,一旦通过我1中删除该节点XML节点降低的总大小和xml结构重新arrange's..so就会提前1个节点futher。 我改变了我的代码为

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

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

这对我有效!

1

当您删除节点列表中的节点时,DOM重新排列它,您的索引将会出错。

DOM中的NodeList和NamedNodeMap对象是活的;也就是 对底层文档结构的更改反映在所有 相关的NodeList和NamedNodeMap对象中。

该kiddo的解决方案工作,但它可能是无效的。所以我只是稍微编辑一下。

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

    //remove case match 
    { 
    //remove 
    i=j; 
    continue; 
    } else { 
    j++; 
    } 
    i++ 
} 

我确实尝试过,它对我有用。