如何在XML GENERATE命令中处理XML编码?

3
我们面临一个问题,在包含特殊字符的xml信息被拒绝,像[·(0xB7),Ý(0xDD),¨(0xA8)]这些实际上是XML有效字符。我们发现这些字符对于未指定的默认编码来说是无效的。如果我们在消息顶部明确添加编码类型,则可以避免此问题。我们使用了UTF-8编码。 因此,通过在XML信息的开头添加“”,这些字符应该变成有效字符。以下是cobol代码:
XML GENERATE RESPONSEDATA FROM ACCT  
    COUNT IN RESPONSEDATALL                  
            WITH ENCODING 1208                      
            WITH XML-DECLARATION                    
END-XML

但是当我们查看生成的XML文件时,其中包含如下所示的字符:

..Ì_%.ÎÁÊËÑ?>.......Á>Ä?ÀÑ>Å..UTF-8.... 

预期的输出是应该将下面的编码位添加到标头中。
<?xml version=“1.0” encoding=“utf-8”?>

问题在于,当这个生成的XML被解析回另一段代码时,它遇到了XML-EXCEPTION并带着异常消息完全退出。

问题是是否有其他需要添加的代码或编译选项,以使此xml有效?


当我们查看XML时,它的外观取决于您用来查看它的软件以及您如何配置该软件。在我看来,这非常类似于使用不了解如何显示UTF-8的东西来显示UTF-8。 - Michael Kay
@MichaelKay 我几乎可以保证他正在使用主机上的股票ISPF查看器查看它,因为这也发生在我身上。 - SaggingRufus
在许多其他环境中,这种情况也发生在我身上了... - Michael Kay
@SaggingRufus 是的,那是正确的。我们是在ISPF查看器中查看它的。 - kushwah_a
1个回答

2

这是完全正常的。

您将XML编码为UTF-8,但是您在主机上查看XML(也就是EBCDIC)。当您的ISPF查看器打开您创建的XML文件时,它只解释十六进制值并试图向您显示某些内容。由于这些值与EBCDIC字符集不匹配,因此看起来像垃圾。如果您将文件通过FTP下载到计算机上,则会发现XML实际上是您要查找的输出。

当您解析XML时,实际上必须执行类似的一些操作并指定生成期间使用的编码。以下代码将解析UTF-8 XML,并在异常情况下将整个XML显示为EBCDIC,以便在主机SYSOUT中可读:

XML PARSE WS-MY-XML
   ENCODING 1208
   PROCESSING PROCEDURE XXXX-PROCESS-XML
   ON EXCEPTION
      DISPLAY "EXCEPTION OCCURED: "
      DISPLAY FUNCTION DISPLAY-OF (
         FUNCTION NATIONAL-OF (
            XML-TEXT 1208
         )
         1140
      )
END-XML

编辑:话虽如此,您的XML仍然可能存在合法错误,例如非法字符。如果我发布的代码也不起作用,请通过FTP将XML上传并通过在线XML验证器运行以查看故障所在。


您发布的代码确实有所帮助,我可以在输出池中看到有效的XML,并且也已经在线验证过了。但是,在解析整个XML时仍然会出现异常(XML-CODE = 788818,表示某种无效的XML),就在最后面。我正在通过SOAP UI客户端进行测试,因此在SOAP客户端中抛出的XML也无法读取,就像在ISPF编辑器中一样。我的问题是,我们使用1208编码生成了XML,然后使用1208编码解析了生成的XML。因此,在将最终的XML发送到CICS容器并最终发送到SOAP之前,我们需要进行任何转换吗? - kushwah_a
我们甚至尝试删除XML PARSE部分,只使用1208编码进行XML GENERATE。但是,在SOAP客户端中生成的XML仍然无法读取(与ISPF视图相同)。因此,不确定是否需要添加其他代码片段才能使其可读/工作。 - kushwah_a
好的,现在我明白了,SOAP客户端也是在EBCDIC中工作。不幸的是,我对SOAP不是非常了解,但是它是UTF-8编码让你出了问题。需要有更多关于SOAP的知识的人来帮助你。 - SaggingRufus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接