如何将`org.w3c.dom.Node`转换为`org.w3c.dom.Comment`

时间:2015-09-08 13:54:30

标签: java xml dom

在应用程序中,我将XML读入org.w3c.dom.Document。然后,我正在搜索要删除的特定节点。

<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将节点转换为字符串并将该字符串放入comment元素中。但我认为这很笨重。

1 个答案:

答案 0 :(得分:0)

您无法直接将某些元素包装到注释中。我认为您应该按照以下方式处理:

  1. 序列化您必须在字符串中删除的元素,
  2. 使用字符串获取作为数据插入注释
  3. 可以通过这种方式实现,假设您的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));
    

    此输出的结果是:

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

    关于序列化,我从here获取了一些材料。

    注意:请注意,如果要注释的元素包含一些注释......注释不能嵌套。