2015-09-08 74 views
0

在一個應用程序中,我將一個XML讀入org.w3c.dom.Document。然後我搜索我想要刪除的特定節點。如何將`org.w3c.dom.Node`轉換爲`org.w3c.dom.Comment`

<list> 
    <item id="1" /> 
    <item id="2" bad="true"> 
    <item id="2.1" /> 
    </item> 
    <item id="3" /> 
</list> 

目前,我由一個新org.w3c.dom.Comment更換節點包含從替代節點複製了一些關鍵信息。

<list> 
    <item id="1" /> 
    <!-- removed bad item with id=2 --> 
    <item id="3" /> 
</list> 

但我寧願將完整的節點及其子結構添加到註釋中,以免信息鬆動。

<list> 
    <item id="1" /> 
    <!-- 
    <item id="2" bad="true"> 
    <item id="2.1" /> 
    </item> 
    --> 
    <item id="3" /> 
</list> 

是否有任何優雅的方法將節點轉換爲註釋,並在稍後的時間點將註釋轉換回節點?

我現在想到的唯一方法是使用javax.xml.transform.Transformer將節點轉換爲字符串並將該字符串放入註釋元素中。但我認爲這會很笨重。

回答

0

您不能直接將某些元素包裝到註釋中。我認爲你應該處理類似如下:

  1. 連載你有一個String要刪除的元素,
  2. 插入帶有字符串評論獲取數據

它可以實現這樣,假設你的XML已經以前已在document變量加載(如一個對象org.w3c.dom.Document):

Node e = document.getDocumentElement().getFirstChild(); 

    // final DOMSerializerImpl ds = new DOMSerializerImpl(); 
    final DOMImplementationLS ls = (DOMImplementationLS) document 
     .getImplementation().getFeature("LS", "3.0"); 
    final LSSerializer ser = ls.createLSSerializer(); 
    ser.getDomConfig().setParameter("xml-declaration", false); 

    do { 
    if (e.getNodeType() == Node.ELEMENT_NODE) { 
     final Element el = (Element) e; 
     if ("true".equals(el.getAttribute("bad"))) { 
     // System.out.println("bad!!"); 
     final String sTextReplace = ser.writeToString(el); 
     el.getParentNode().replaceChild(
      document.createComment(sTextReplace), el); 
     } 
     e = e.getNextSibling(); 
    } 
    } while (e != null); 

    document.getDocumentElement().normalize(); 

    System.out.println(ser.writeToString(document)); 

結果此outpu t是:

<list><item id="1"/><!--<item bad="true" id="2"><item id="2.1"/></item>--><item id="3"/></list> 

關於系列化,我花了一些材料here

注意:要小心,如果有評論的元素也包含一些評論...評論不能嵌套。

+0

我曾希望更優雅的東西,但也許這只是它。所以我現在接受這個答案。 – schlac

相關問題