2014-07-09 3 views
0

여기에 내 코드XML 문서 (DOM4J)에서 노드를 삭제하는 방법

public Document getNewFeedDocument(Document doc) { 

     Element root = doc.getRootElement(); 

     List<Node> nodes = doc.selectNodes("Message"); 

     for(int i=0; i<nodes.size(); i++) { 
      String message_ID = ((Element)nodes.get(i)).selectSingleNode("MessageID").getText(); 
      if(Integer.parseInt(message_ID)%2==0) { 
       nodes.get(i).detach(); 
      } 
     } 
     try { 
      SAXReader reader = new SAXReader(); 
      return reader.read(new StringReader(root.asXML())); 
     } catch(Exception e) { 
      return null; 
     } 
    } 

이다 그러나 이것은 내가 문서를 수정 얻을 수있는 방법, 같은 문서를 반환합니다.

+0

코드가 노드 목록에서 분리하려고 시도하지만 수정하지 않고 원래 루트로 되돌려 놓습니다. – Vihar

답변

1

나는 selectNodes가 임시 문서를 생성한다고 생각한다. 원래 문서를 반복하십시오 :

private boolean toRemove(Node node){ 
    if(! "Message".equals(node.getName()) return; 
    String message_ID = 
     ((Element)nodes.get(i)).selectSingleNode("MessageID").getText(); 
    return Integer.parseInt(message_ID)%2 == 0;  
} 

public void treeWalk(Element element) { 
    for (int i = 0, size = element.nodeCount(); i < size; i++) { 
     Node node = element.node(i); 
     if (node instanceof Element) { 
      if(toRemove(node)){ 
       node.detach(); 
       i--; 
      } else { 
       treeWalk((Element) node); 
      } 
     } 
    } 
} 

treeWalk(doc.getRootElement()); 
+1

이것은 실제로 모든 노드를 통과하지는 않습니다. 왜냐하면 재귀 중에 노드를 분리하기 때문입니다. 또한 현재 색인에서 노드를 제거하기 위해 노드를 분리 할 때'i'를 감소시켜야하고 나머지 색인에서는 더 낮은 색인을 갖는 노드를 줄여야합니다. 그렇지 않으면 노드를 분리 할 때마다 다음 노드가 검사에 의해 자동으로 건너 뜁니다. – t0mppa

+1

i - edited를 줄이는 것에 대한 힌트를 주셔서 감사합니다. 그러나 재귀가 어쨌든 트리에서 잘라내 질 요소로 들어가야한다고 생각하는 이유가 확실하지 않습니다. – laune

+1

+1, 이제 더 유용합니다. 재귀가 정리 된 요소에 들어가야한다는 뜻은 아니 었습니다. 미안하지만 그 인상을 주면. 오직 인덱스에 의한 루핑과 루프 중간에있는 아이템 제거에 대해 논평하기를 원했고, 루프 될 나머지 아이템의 인덱스를 변경했습니다. – t0mppa