我开发了一个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>
答案 0 :(得分:3)
遗憾的是,这是SOAP的一个自然问题 - 它使用XML作为文本,而这些字符无法用XML表示(即使是实体)。
你能以某种方式逃避不可打印的角色吗?不幸的是,你需要找到一些不将它们表示为直文的方法。
答案 1 :(得分:1)
当您构建XML时,您将要隐藏在SOAP XML信封中,您需要确保在属性值和元素中的任何文本节点中没有任何未转义的字符。那就是:
<your_elt your_attr="Don't put unescaped chars here, eg, apostrophe">
<foo>
Be sure to escape stuff here too, like: 2 < 100
A greek lambda is escaped like this: λ
</foo>
</your_elt>
我假设您在Java中执行此操作,因此您应该自动查看为您执行此操作的库。例如,Apache有StringEscapeUtils。
您的控制字符需要通过XML numeric character references进行转义。希望StringEscapeUtils为您处理。
希望这有帮助。
答案 2 :(得分:1)
将CDATA用于不属于xml结构的数据(即内容),如果我理解正确并且您只是路由消息,那么这就是您应该做的事情。
答案 3 :(得分:0)
听起来你的文字无法用XML表示。你将不得不逃避这些角色,但说实话,我怀疑你应该“逃避”整个字符串。 Base64编码字符串可能有效,但您也可以查看MTOM或其他一些跨Web服务传递二进制数据的机制。
如果您拥有此系统的两端(客户端和Web服务),那么添加编码/解码步骤应该不会太困难,而base64编码就足够了。