【问题标题】:illegal XML characters /Axis非法 XML 字符 /Axis
【发布时间】:2009-05-21 14:52:56
【问题描述】:

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

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

请问你有什么想法吗?

编辑:

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

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>

【问题讨论】:

    标签: java service axis


    【解决方案1】:

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

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

    【讨论】:

    • 我无法逃避那些我需要它们进行进一步处理的字符。那么我该如何进行呢?
    • 你将要拥有以某种方式逃脱它们。但是,如果您在调用方对它们进行转义,则可以在接收方对它们进行转义,从而仍然使用数据。我并不是建议删除“坏”字符。
    • 要更清楚。我正在开发一个网关,它将从具有严格形式的终端接收帧,因此我无法触摸它。我的网络服务必须能够接收它以及它再次转发到服务器!我现在正在为本地主机中的测试创建一个客户端 Web 服务!
    • 这个网络服务的目的是传输数据,双方都在你的掌控之中,对吧?因此,在传输数据之前对数据进行转义,并在收到数据后立即取消转义。您仍然可以获得所有数据。如果您 控制双方,则基本上没有选择:您不能 将这些字符包含在有效的 XML 中。这只是无效的 XML。
    • 如果您正在开发 Web 服务,那么谁在开发客户端?你不能让他们逃跑吗?
    【解决方案2】:

    当您形成要塞入 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 numeric character references 进行转义。希望 StringEscapeUtils 为您处理。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 很遗憾没有!我只是在开发网络服务!通常我会从终端收到一个字符串!!!
        • 因此,如果您拥有该服务,则您正在定义合同和消息传递语义。这允许您说“向我发送有效的 XML”或说“编码您的文本”,不是吗?
        • 唯一不会出现这种情况的情况是,您正在实施一个众所周知的服务合同并且无法更改客户端。
        • 类似的东西!!我已经有一个系统在运行,我必须在终端和服务器之间添加一个中间件。
        猜你喜欢
        • 2011-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多