2009-09-16 6 views
1

W3C DOM을 사용하여 트리를 업데이트하는 방법을 찾고 있습니다. 나는 아래와 같이 너비 우선 탐색을 할 생각을 해봤지만 그 자리 교체를 어떻게하는지 생각할 수는 없습니까?Java에서 DOM 요소를 검색하고 바꿉니다.

import org.w3c.dom.Node; 

private Element tree; 

public void searchReplace(Node x, Node y){ 
    Queue<Node> q = new LinkedList<Node>(); 
    q.add(tree); 
    while (!q.isEmpty()) { 
     Node current = q.remove(); 
     if (current == x){ 
      // do replacement 
     } 

     NodeList children = current.getChildNodes(); 
     for (int i = 0; i < children.getLength(); i++) { 
      q.add(children.item(i)); 
     } 
    } 
} 

나는 그 값이 아닌 노드 이름을 대체하는 데에만 관심이 있습니다.

답변

2

노드의 이름을 변경하려면 searchReplace() 메소드가 필요합니다 (문제의 노드가 이미 있기 때문에) DocumentrenameNode()을 호출하면됩니다. 예.

document.renameNode(node, null, "new name"); 
+0

이것은 Java 6에서 특히 중요하며, Java 8에서 null 대신 빈 문자열을 사용하면 Java 6은 메시지 내에서 HIERARCHY_REQUEST_ERR과 함께 org.w3c.dom.DOMException을 발생시킵니다 –

0

아마도 JDom과 같은 래퍼 API를 사용하여 가능할 수도 있지만, 그렇다고해도 자식 요소 주문 (doublefull)이 유지되는지 확실하지 않습니다. DOM 인터페이스의 구현을 롤링하는 방법을 찾고 있습니다.

1

Element을 바꾸려면 Node#replaceChild()을 사용할 수 있습니다. 예를 들어, 당신이

current.getParentNode().replaceChild(y, current) 
+0

예외가 발생합니다. HIERARCHY_REQUEST_ERR : 허용되지 않는 노드를 삽입하려고 시도했습니다. – Robert

+0

JavaDoc의 경우 : "HIERARCHY_REQUEST_ERR :이 노드가 newChild 노드 유형의 자식을 허용하지 않는 유형 인 경우 또는 배치 할 노드가이 노드의 조상 또는이 노드 자체 중 하나 인 경우 발생합니다." – janko

1

는 DOM을 검색하는 XPath 클래스를 사용하여 사용하는 것이 y에 의해 current을 대체한다. 사용법은이 simple example을 참조하십시오.

관련 문제