You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:04:58