当前位置:  开发笔记 > 编程语言 > 正文

如何在序列化之前从DOM中删除仅空白文本节点?

如何解决《如何在序列化之前从DOM中删除仅空白文本节点?》经验,为你挑选了2个好方法。

我有一些Java(5.0)代码从各种(缓存)数据源构造DOM,然后删除不需要的某些元素节点,然后使用以下方法将结果序列化为XML字符串:

// Serialize DOM back into a string
Writer out = new StringWriter();
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
tf.setOutputProperty(OutputKeys.INDENT, "no");
tf.transform(new DOMSource(doc), new StreamResult(out));
return out.toString();

但是,由于我要删除多个元素节点,最终在最终的序列化文档中会有很多额外的空格.

是否有一种简单的方法可以在将序列化为字符串之前(或同时)从DOM中删除/折叠无关的空格?



1> James Murty..:

您可以使用XPath找到空文本节点,然后以编程方式删除它们,如下所示:

XPathFactory xpathFactory = XPathFactory.newInstance();
// XPath to find empty text nodes.
XPathExpression xpathExp = xpathFactory.newXPath().compile(
        "//text()[normalize-space(.) = '']");  
NodeList emptyTextNodes = (NodeList) 
        xpathExp.evaluate(doc, XPathConstants.NODESET);

// Remove each empty text node from document.
for (int i = 0; i < emptyTextNodes.getLength(); i++) {
    Node emptyTextNode = emptyTextNodes.item(i);
    emptyTextNode.getParentNode().removeChild(emptyTextNode);
}

如果您希望更多地控制节点删除,而不是使用XSL模板轻松实现,则此方法可能很有用.


很好的答案.即使没有normalize()也适合我.
顺便说一下,如果我在删除节点之前首先调用doc.normalize(),这个方法似乎才有效.我不确定为什么会有所作为.

2> objects..:

尝试使用以下XSL和strip-space元素来序列化DOM:



  

  

  
    
     
    
  


http://helpdesk.objects.com.au/java/how-do-i-remove-whitespace-from-an-xml-document

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有