我正在尝试使用 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 <
> becomes >
" becomes "
' becomes '
& becomes &
我也试过给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><?xm
l version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope..
...<SOAP-ENV:Envelope></_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/