2013-03-14 67 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++ 
} 

我確實嘗試過,它對我有用。