Java生成含异常栈追踪的XML:多余空格问题解决求助
解决XML中异常栈追踪额外缩进的问题
问题原因
你遇到的额外空格,是因为DOM生成XML时默认开启了自动格式化缩进。当<Comment>元素包含多行文本时,序列化工具会给每一行(除了第一行)添加和元素本身缩进一致的空格,导致栈追踪的原始空白被额外空格覆盖。
解决方案
方案一:修改XML生成逻辑,禁用自动缩进或使用CDATA
1. 禁用XML输出的自动缩进
在生成XML的Transformer步骤中,关闭自动缩进属性,让栈追踪的原始空白完全保留:
TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); // 关闭自动缩进,避免给栈追踪添加额外空格 transformer.setOutputProperty(OutputKeys.INDENT, "no"); // 执行XML输出 transformer.transform(new DOMSource(doc), new StreamResult(new File("output.xml")));
这样生成的<Comment>内容会完全匹配原始栈追踪的格式,没有额外缩进。
2. 用CDATA包裹栈追踪
CDATA段内的内容不会被XML格式化工具修改,能完整保留原始空白:
Element comment = doc.createElement("Comment"); // 创建CDATA段,将栈追踪作为内容传入 CDATASection cdataSection = doc.createCDATASection(stacktrace); comment.appendChild(cdataSection);
生成的XML会是类似这样的结构:
<Comment><![CDATA[java.lang.Exception: foo at ... at ... Caused by: java.lang.IllegalArgumentException: fee at ...]]></Comment>
后续XSL渲染时,white-space: pre依然能正确解析CDATA内的换行和制表符。
方案二:修改XSL,移除额外缩进
如果无法修改XML生成逻辑,可以在XSL中通过字符串替换去掉每一行开头的额外空格。假设每一行多了8个空格,使用XSLT的replace函数(需XSLT 2.0及以上):
<td class="RESULT"> <xsl:value-of select="replace(Comment, '^ {8}', '', 'm')"/> </td>
'm'表示多行模式,^会匹配每一行的开头- 把每一行开头的8个空格替换为空,还原原始栈追踪格式
如果XML生成的缩进数量不固定,可以先获取<Comment>元素的缩进级别,但这种方式复杂度较高,优先推荐方案一。
内容的提问来源于stack exchange,提问作者H.v.M.
相关产品推荐
相关产品推荐

