1

我想将文档中单个命名空间声明的双引号更改为单引号,同时将所有其他命名空间声明保留为双引号。我怎样才能做到这一点?

这是来自服务器的响应文档:

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><InquiryResponse xmlns="http://www.openuri.org/"><Header><HeaderAttr1>abcd</HeaderAttr1><HeaderAttr2>xxx</HeaderAttr2><HeaderAttr3>string</HeaderAttr3></Header><Body><InquiryResult><ResultItem1>theresulttext</ResultItem1><ResultItem2>abcd</ResultItem2><ResultItem3>0</ResultItem3></InquiryResult></Body></InquiryResponse></soapenv:Body></soapenv:Envelope>

我需要类似的东西(注意 open:InquiryResponse 没有“)。

<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <open:InquiryResponse xmlns:open='http://www.openuri.org/'><open:Header><open:HeaderAttr1>abcd</open:HeaderAttr1><open:HeaderAttr2>xxx</open:HeaderAttr2><open:HeaderAttr3>string</open:HeaderAttr3></open:Header><open:Body><open:InquiryResult><open:ResultItem1>theresulttext</open:ResultItem1><open:ResultItem2>abcd</open:ResultItem2><open:ResultItem3>0</open:ResultItem3></open:InquiryResult></open:Body></open:InquiryResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

我已经能够进行命名空间前缀更改、附加命名空间声明、空白修正、字符集更改,我现在只需要更改这两个字节。

我正在使用 Spring WS + Woodstox + Axiom 构建一个简单的查询 Web 服务。它是现有服务的替代品,我想让它逐字节相同($$ 原因)。我可以将 XML 转换为相同的类型,但目前我们不知道哪些消费者使用 grep 或正则表达式来查找数据。

到目前为止,我正在尝试使用 XSLT 和 PayloadTransformingInterceptor 来解决这个问题。我也会对其他选项感兴趣。

4

3 回答 3

1

评论非常正确:没有“干净”的编程解决方案可以如此精确地配置低级别。考虑到脆弱性,你最好使用文本修饰;如果这是用于测试等,最有可能的正则表达式会很好地工作。

于 2012-09-21T21:16:37.100 回答
0

解决方案是放弃 Spring-WS,转而使用 CXF。CXF 允许拦截器在任何处理阶段,因此可以完全访问消息流的字节。丑陋,但工作。构建一个拦截器以在 PRE_STREAM 处挂钩 OutputStream,然后在 PRE_STREAM_ENDING 处进行修复,您将完全控制 SOAP 信封。

谢谢大家的回复。它很糟糕,但它有效,并且当我们有时间正确地做它时很容易断开连接(!!)。

于 2012-09-29T11:04:06.240 回答
0

在重新阅读您的问题和示例几次后,我想我理解了这个问题:)

我认为你应该看看PayloadTransformingInterceptor。您可以在该拦截器中转换传入和传出消息。该拦截器的典型用法是通过将旧版本的 wsdl 转换为新版本来支持它。这个拦截器可以双向工作 - 在你的情况下只有传出。

我不确定这是否可以通过使用 XSLT 来解决。如果没有,您可以创建自己的拦截器来提供您需要的特定字符串替换功能。

于 2012-09-28T12:41:40.730 回答