在应用程序中,我将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元素中。但我认为这很笨重。
答案 0 :(得分:0)
您无法直接将某些元素包装到注释中。我认为您应该按照以下方式处理:
可以通过这种方式实现,假设您的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获取了一些材料。
注意:请注意,如果要注释的元素包含一些注释......注释不能嵌套。