xml - COBOL 使用 CDATA 生成 XML 文件

标签 xml cobol cdata generate

我正在尝试使用 GENERATE 语句在 COBOL 中创建一个 XML 文件。 到目前为止,一切都很好。 但是对于这个特定的 xml,它需要在其中包含一个单独的 xml 文件。所以我想在它周围使用 CDATA 标签。但是,有没有办法在 COBOL 中使用 GENERATE 语句来做到这一点?

这里是一个例子。

   01    request.
         06    route.
         11    name                  PIC  X(030).
         11    version               PIC  9(004).
         06    question.
         11    IDENT                 PIC  9(009).
         11    xmlFileName           PIC  X(006).
         11    xmlFileInh            PIC  X(5000).

xmlFileInh 需要用另一个 XML 文件填充。这只能是 xml 或 soap 请求。

像这样:

<?xml version="1.0" encoding="UTF-8"?>
<request>
  <route>
    <name>serviceRequest</name>
    <version>1</version>
  </route>
  <question>
    <IDENT>111111111</IDENT>
    <xmlFileName>FILE-1</xmlFileName>
    <xmlFileInh>
       <![CDATA[<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope.....<SOAP-ENV:Envelope]]>
    </xmlFileInh>
  </question>
</request>

我尝试将 "<![CDATA[" and "]]>" 串起来围绕传入的 XML 文件,然后将其放入 xmlFileInh。这做了一些事情,但是将所有 HTML 控制字符呈现为我不想要的东西在我的 xml 文件中。 GENERATE 语句对 CDATA 没有任何作用。

< becomes   &lt;
> becomes   &gt;
" becomes   &quot;
' becomes   &apos;
& becomes   &amp;

我也试过给xmlFileInh换个图,连XML都打。这在我的 XML、名称长度和数据长度等中提供了很多新类型的标签,但我不想要。

有没有人有解决办法?

提前致谢 马丁。

最佳答案

您可能根本不需要使用 CDATA。 XML GENERATE 将获取 XMLFILEINH 的内容并转义特殊字符(如您所指示)。使用简单的文本编辑器查看时生成的 XML 将显示转义序列——这不是您想要的。但是,当您使用 XML PARSE 对其进行处理时,转义字符将再次被其原始内容替换。此外,大多数 XML 感知查看器(例如 Microsoft Edge 等)将按照您的预期显示内容,而无需转义序列。

下面是一个 IBM Enterprise COBOL 6.2 程序示例来说明我的观点:

  IDENTIFICATION DIVISION.
  PROGRAM-ID. XML5.
  DATA DIVISION.
  WORKING-STORAGE SECTION.

  01  REQUEST.
      06 ROUTE.
        11 NAME                  PIC  X(030).
        11 VERSION               PIC  9(004).
      06 QUESTION.
        11 IDENT                 PIC  9(009).
        11 XMLFILENAME           PIC  X(006).
        11 XMLFILEINH            PIC  X(5000).


  01  XML-DOC                    PIC X(5000).
  01  XML-IDX                    PIC S9(9) BINARY.
  01  XML-CHAR-CNT               PIC S9(9) BINARY.

  PROCEDURE DIVISION.
  MAINLINE SECTION.
      MOVE 'serviceRequest' TO NAME
      MOVE 1                TO VERSION
      MOVE 111111111        TO IDENT
      MOVE 'FILE-1'         TO XMLFILENAME
      MOVE '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelop
 -         'e.....<SOAP-ENV:Envelope>'
        TO XMLFILEINH

      INITIALIZE XML-DOC
      XML GENERATE XML-DOC FROM REQUEST COUNT IN XML-CHAR-CNT
      PERFORM VARYING XML-IDX FROM 1 BY 80
                UNTIL XML-IDX > XML-CHAR-CNT
         DISPLAY XML-DOC (XML-IDX : 80)
      END-PERFORM

      XML PARSE XML-DOC PROCESSING PROCEDURE XML-HANDLER
          ON EXCEPTION
             DISPLAY 'XML Error: ' XML-CODE
             GOBACK
          NOT ON EXCEPTION
             DISPLAY 'ALL DONE.'
      END-XML
      GOBACK
      .

  XML-HANDLER.
      DISPLAY XML-EVENT (1:22) ':' XML-TEXT
      .

输出是:

<REQUEST><ROUTE><NAME>serviceRequest</NAME><VERSION>1</VERSION></ROUTE><QUESTION
><IDENT>111111111</IDENT><_XMLFILENAME>FILE-1</_XMLFILENAME><_XMLFILEINH>&lt;?xm
l version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;SOAP-ENV:Envelope..
...&lt;SOAP-ENV:Envelope&gt;</_XMLFILEINH></QUESTION></REQUEST>
START-OF-DOCUMENT     :
START-OF-ELEMENT      :REQUEST
START-OF-ELEMENT      :ROUTE
START-OF-ELEMENT      :NAME
CONTENT-CHARACTERS    :serviceRequest
END-OF-ELEMENT        :NAME
START-OF-ELEMENT      :VERSION
CONTENT-CHARACTERS    :1
END-OF-ELEMENT        :VERSION
END-OF-ELEMENT        :ROUTE
START-OF-ELEMENT      :QUESTION
START-OF-ELEMENT      :IDENT
CONTENT-CHARACTERS    :111111111
END-OF-ELEMENT        :IDENT
START-OF-ELEMENT      :_XMLFILENAME
CONTENT-CHARACTERS    :FILE-1
END-OF-ELEMENT        :_XMLFILENAME
START-OF-ELEMENT      :_XMLFILEINH
CONTENT-CHARACTERS    :<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope.....<SOAP-ENV:Envelope>
END-OF-ELEMENT        :_XMLFILEINH
END-OF-ELEMENT        :QUESTION
END-OF-ELEMENT        :REQUEST
END-OF-DOCUMENT       :
ALL DONE.

注意在生成的 XML 的“原始”转储中转义特殊字符,但在完成 XML PARSE 后,它们将恢复为提供给 XML GENERATE 的内容。这是正常的 XML 处理。像这样的字符转义可以保护您在传输生成的 XML 时免受代码页转换的影响。使用 CDATA 时,当文档必须从一个代码页转换为另一个代码页并且没有针对给定字符的直接映射(不太可能但可能)时,可能会出现损坏。

我在这里发现有趣但无法解释的是为什么生成的 XML 标记名称以 XML 开头以下划线为前缀。

最后说明:如果COBOL变量的内容XMLFILEINH包含序列 </_XMLFILEINH>在某个地方,人们可能会认为这会导致 <_XMLFILEINH> 过早结束。生成的 XML 中的标记。这不是因为开始和结束定界符 <>在 GENERATE 上被转义。

关于xml - COBOL 使用 CDATA 生成 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60411833/

相关文章:

PHP SimpleXML - 一行解决查找一键;在 XML 文件中找到其父级?

python - 在python lxml中获取无值(value)的元素

cobol - 我如何列出 GnuCOBOL 中的目录内容?

python - BeautifulSoup 能否保留 CDATA 部分?

python - 为什么 BeautifulSoup 将 <html><body><p> 添加到我的结果中?

html - CDATA 不适用于 <pre> 标记内的 C++ 代码

Xmlstarlet - 将一个属性的值复制到另一个属性(如果元素中存在)

python - 通过检查 int 范围替换文本

.net - .NET 中真的有 COBOL 吗?

java - 如何为 Cobol copybook 生成 java~jrecord 代码