5

我开发了一个 Web 服务并使用 Axis 部署它。一切都运行得很好,但是当我使用包含不可打印字符(例如 ETX、FS、..)的字符串使用服务时遇到问题。我有以下错误:

exception: java.lang.IllegalArgumentException: The char '0x1c' after '....' is not a valid XML character.

请问你有什么想法吗?

编辑 :

我必须使用 Web 服务向我的服务器发送一个帧。我的框架有一个严格的形式(包含一些不可打印的字符作为分隔符)

class Automate {void checkFrame(String frame){// checking the frame}}

wsdl 文件

<?xml version="1.0" encoding="UTF-8"?>

  <wsdl:part element="impl:checkFrameResponse" name="parameters"/>

  <wsdl:part element="impl:checkFrame" name="parameters"/>

  <wsdl:operation name="checkFrame">

     <wsdl:input message="impl:checkFrameRequest" name="checkFrameRequest"/>

     <wsdl:output message="impl:checkFrameResponse" name="checkFrameResponse"/>

  </wsdl:operation>

  <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

  <wsdl:operation name="checkFrame">

     <wsdlsoap:operation soapAction=""/>

     <wsdl:input name="checkFrameRequest">

        <wsdlsoap:body use="literal"/>

     </wsdl:input>

     <wsdl:output name="checkFrameResponse">

        <wsdlsoap:body use="literal"/>

     </wsdl:output>

  </wsdl:operation>

  <wsdl:port binding="impl:AutomateSoapBinding" name="Automate">

     <wsdlsoap:address location="http://localhost:8080/Gateway/services/Automate"/>

  </wsdl:port>

4

4 回答 4

3

不幸的是,这是 SOAP 的一个自然问题 - 它使用 XML 作为文本,而这些字符不能用 XML 表示(即使是实体)。

你能以某种方式逃避不可打印的字符吗?不幸的是,您需要找到一些不将它们表示为直接文本的方法。

于 2009-05-21T15:01:38.667 回答
1

当您形成要塞入 SOAP XML 信封的 XML 时,您需要确保在属性值和元素中的任何文本节点中没有任何未转义的字符。那是:

<your_elt your_attr="Don&apos;t put unescaped chars here, eg, apostrophe">
    <foo>
        Be sure to escape stuff here too, like: 2 &lt; 100
        A greek lambda is escaped like this: &#955;
    </foo>
</your_elt>

我假设您在 Java 中执行此操作,因此您应该查看自动为您执行此操作的库。例如, Apache 有StringEscapeUtils

您的控制字符需要通过 XML数字字符引用进行转义。希望 StringEscapeUtils 为您处理。

希望这可以帮助。

于 2009-05-22T03:14:19.280 回答
1

将 CDATA 用于不属于 xml 结构(即内容)的数据,如果我理解正确并且您只是在路由消息,那么您应该这样做。

于 2009-08-05T20:46:14.353 回答
0

听起来您的文本不可能用 XML 表示。您将不得不转义这些字符,但老实说,我怀疑您应该“转义”整个字符串。Base64 编码字符串可能有效,但您也可以查看 MTOM 或其他一些跨 Web 服务传递二进制数据的机制。

如果您拥有该系统的双方(客户端和 Web 服务),那么添加编码/解码步骤应该不会太难,并且 base64 编码应该足够了。

于 2009-05-21T15:52:09.923 回答