Web Service中XML怎么用 SOAP消息XML结构

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 内,含 faultcodefaultstring 等子元素

实际请求与响应的 XML 示例

以调用 add(x=5, y=3) 为例,请求和响应的 XML 结构非常对称:

请求(客户端发):



  
    
      5
      3
    
  

响应(服务端回):



  
    
      8
    
  

注意:xmlns="http://service/" 是服务定义的命名空间,必须与 WSDL 中一致,否则解析会失败。

XML 使用中容易出错的细节

  • 不能有 DTD 声明或 XML 处理指令(如 ),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())比递归遍历更稳