2010年2月11日木曜日

[java][dom]子要素を残して自身を削除する

なんか、悲しいタイトルになってしまった。
---
/**
 * <code>org.w3c.dom</code>の子要素を残して自身を削除できるか。
 * @throws Exception
 */
@Test
public void testNonMethod_InsertBeforeChildNodes() throws Exception{
  String xml = "<html><head/><body><h1>クラス Pattern</h1><span class=\"normal\">コンパイル済みの正規表現です。</span>" + 
  "<h1>クラス Matcher</h1><span class=\"normal\">マッチ操作を行うエンジンです。</span></body></html>";
  Document doc = DomUtils.stringToDocument(xml);
  //span要素を削除して、span要素の子孫は残します。
  NodeList nodeList = DomUtils.findNodesByXPath(doc, "//*");
  for(int i=0;i<nodeList.getLength();i++){
    Node node = nodeList.item(i);
    if(node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equals("span")){
      //親を呼び出します。
      Node parent = node.getParentNode();
      NodeList childNodes = node.getChildNodes();  
      //ノードの挿入は親に頼みます。
      for(int j=0; j < childNodes.getLength(); j++){
        Node child = childNodes.item(j).cloneNode(true); //修正
        parent.insertBefore(child, node);
      }
      parent.removeChild(node);
    }
  }
  String actual = DomUtils.nodeToString(doc);
  System.out.println(actual);
}
---

出力結果
---
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   </head>
   <body>
      <h1>クラス Pattern</h1>コンパイル済みの正規表現です。
      <h1>クラス Matcher</h1>マッチ操作を行うエンジンです。
   </body>
</html>
---

ではまた。


修正:
誤)Node child = childNodes.item(j);
正)Node child = childNodes.item(j).cloneNode(true);

0 件のコメント:

コメントを投稿