Java 调用webservice接口输出xml自动转义
在Java调用WebService接口输出XML时,若出现自动转义问题(如<转为<、&转为&),需根据XML生成方式和工具特性针对性处理。以下是核心解决方案及实践建议:
一、问题根源分析
- 工具默认转义
 XML生成工具(如DOM、XStream等)默认会对特殊字符进行转义,确保XML结构合法。
- 字符串拼接问题
 直接拼接字符串生成XML时,未正确使用转义或CDATA区块,导致字符被二次处理。
- 框架干扰
 部分框架(如Spring Boot)或工具链(如RestTemplate)可能隐式修改XML内容。
二、核心解决方案
1. 使用DOM API生成XML(推荐)
通过Java标准DOM API生成XML,由API自动处理转义逻辑,避免手动拼接错误:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); Element root = doc.createElement("Response"); 
Text content = doc.createTextNode("<value>&</value>"); // 直接写入原始字符 root.appendChild(content);
doc.appendChild(root); // 输出时,DOM自动转义为<value>&</value> 
TransformerFactory.newInstance().newTransformer() .transform(new DOMSource(doc), new StreamResult(System.out)); 
2. 利用CDATA区块保留原始内容
通过<![CDATA[...]]>包裹需保留的原始数据,跳过转义逻辑67:
Element data = doc.createElement("data"); 
CDATASection cdata = doc.createCDATASection("<script>alert('xss')</script>"); data.appendChild(cdata); // 输出:<data><![CDATA[<script>alert('xss')</script>]]></data> 
3. 使用第三方库控制转义
- XStream库
 配置XStream禁用转义或自定义字符处理规则:XStream xstream = new XStream();
xstream.allowTypesByWildcard(new String[]{"com.example.**"}); // 安全配置 xstream.alias("response", Response.class); 
String xml = xstream.toXML(new Response("<data>&</data>")); // 输出原始内容 
- JAXB注解
 通过@XmlAccessorType和@XmlElement控制字段序列化行为5:@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD)
public class Response { @XmlElement(name = "content") private String data; // 直接赋值"<value>&</value>" } 
4. 手动反转义处理
若已生成转义内容,可用StringEscapeUtils.unescapeXml()恢复原始字符37:
String escapedXml = "<value>&</value>"; 
String rawXml = StringEscapeUtils.unescapeXml(escapedXml); // 输出<value>&</value> 
三、注意事项
| 场景 | 处理建议 | |
|---|---|---|
| 动态生成复杂XML | 优先使用DOM或JAXB/XStream等工具库 | |
| 需保留HTML/JS代码片段 | 使用CDATA区块包裹 | |
| 框架隐式修改XML(如Spring) | 检查 @ResponseBody或消息转换器配置 | |
| 避免XSS注入风险 | 仅对可信数据禁用转义,否则保留默认转义 | 
四、验证与调试
- 输出日志检查
 通过日志或断点确认生成的XML内容是否符合预期格式。
- XML解析测试
 使用DocumentBuilder.parse()验证XML是否可被标准解析器读取。
- 工具链排查
 检查WebService客户端库(如Axis2、CXF)是否自带转义逻辑,需通过配置关闭。
通过上述方法,可精准控制XML输出的转义行为,平衡数据安全性与格式完整性。
