XML在Web Service中核心作用是承载严格结构化的SOAP消息,必须包含soap:Envelope(根元素)、soap:Body(必需),可选soap:Header和soap:Fault;需正确声明命名空间、禁用DTD、注意大小写与编码一致性。

Web Service 中 XML 的核心作用,就是承载 SOAP 消息——它不是普通 XML,而是严格遵循语法规则的结构化通信载体。关键不在于写得多花哨,而在于元素完整、命名空间正确、层级清晰。
SOAP 消息必须包含的四大 XML 元素
每条合法的 SOAP 消息都是一份标准 XML 文档,由以下四部分构成(Header 和 Fault 为可选):
-
soap:Envelope:根元素,标识这是一个 SOAP 消息;必须声明命名空间,如
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" - soap:Header(可选):放认证、事务 ID、路由等上下文信息;无 Header 时可省略整个标签
- soap:Body:必需,所有业务数据都在这里;请求时放操作名和参数,响应时放返回结果
-
soap:Fault(可选):仅当服务端出错时出现,放在 Body 内,含
faultcode、faultstring等子元素
实际请求与响应的 XML 示例
以调用 add(x=5, y=3) 为例,请求和响应的 XML 结构非常对称:
请求(客户端发):
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<add xmlns="http://service/">
<x>5</x>
<y>3</y>
</add>
</soap:Body>
</soap:Envelope>
响应(服务端回):
<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<addResponse xmlns="http://service/">
<addResult>8</addResult>
</addResponse>
</soap:Body>
</soap:Envelope>
注意:xmlns="http://service/" 是服务定义的命名空间,必须与 WSDL 中一致,否则解析会失败。
XML 使用中容易出错的细节
- 不能有 DTD 声明或 XML 处理指令(如
<?xml-stylesheet ...?>),SOAP 规范明确禁止 - 命名空间大小写敏感,
soap:Envelope不能写成SOAP:ENVELOPE - HTTP 请求头中需匹配
SOAPAction字段,值通常是"http://service/add"这类 URI(与 WSDL 中 operation 的 soapAction 属性一致) - 中文或特殊字符需确保 XML 声明中的 encoding 与实际编码一致,推荐统一用
UTF-8
Java 解析 SOAP XML 的实用要点
若需手动解析(比如绕过 JAX-WS 代理),重点在两点:
- 创建
DocumentBuilderFactory时务必调用setNamespaceAware(true),否则带命名空间的标签(如soap:Body)无法正确识别 - 提取业务数据建议用
getElementsByTagNameNS("http://service/", "addResult"),而非只靠标签名,避免命名空间冲突 - Body 内容可能嵌套多层,优先用 XPath(如
//addResponse/addResult/text())比递归遍历更稳










