生成 XML 输出
要将 COBOL 数据转换为 XML,请使用 XML GENERATE 语句,如下例所示。
关于此任务
XML GENERATE XML-OUTPUT FROM SOURCE-REC
COUNT IN XML-CHAR-COUNT
ON EXCEPTION
DISPLAY 'XML generation error ' XML-CODE
STOP RUN
NOT ON EXCEPTION
DISPLAY 'XML document was successfully generated.'
END-XML
在 XML GENERATE 语句中,首先确定要接收XML输出的数据项(如前例中的XML-OUTPUT )。 将数据项定义得足够大,以包含生成的 XML 输出,通常是 COBOL 源数据大小的 5 到 10 倍,具体取决于其数据名称或数据名称的长度。
在 DATA DIVISION中,可以 将 接收标识定义为 字母数字 (字母数字组项或类别字母数字的基本项) 或国家或地区 (国家或地区组项或类别国家或地区的基本项)。
接下来,您将识别要变换为 XML 格式的 源数据项 (在示例中为SOURCE-REC )。 源数据项可以是字母数字组项,国家或区域组项,也可以是类字母数字或国家或区域的基本数据项。
某些 COBOL 数据项不会转换为 XML,而是被忽略。 如果以下情况,那么将忽略您变换为 XML 的 字母数字组项或国家组项 的下级数据项:
- 指定
REDEFINES子句,或者从属于此类重新定义项 - 指定
RENAMES子句
生成 XML 时,还会忽略以下项 在源数据项中 :
- 基本
FILLER(或未命名) 数据项 - 为
SYNCHRONIZED个数据项插入的 Slack 字节数
不会插入额外的空格 (例如,换行或缩进) 以使生成的 XML 更易读。
(可选) 您可以对 COUNT IN 短语进行编码,以获取生成 XML 输出期间填充的 XML 字符 encoding units 的数目。 如果接收标识具有国家或地区类别,那么计数采用 UTF-16 字符编码单元。 对于所有其他编码 (包括 UTF-8) ,计数以字节为单位。
您可以使用计数字段作为引用修改长度,以仅获取包含生成的 XML 输出的接收数据项的该部分。 例如, XML-OUTPUT(1:XML-CHAR-COUNT) 引用 XML-OUTPUT的前 XML-CHAR-COUNT 个字符位置。
请考虑以下程序摘录:
01 doc pic x(512).
01 docSize pic 9(9) binary.
01 G.
05 A pic x(3) value "aaa".
05 B.
10 C pic x(3) value "ccc".
10 D pic x(3) value "ddd".
05 E pic x(3) value "eee".
. . .
XML Generate Doc from G
之前的代码生成以下XML文档,其中 A、 B 和 E 作为元素 G 的子元素,而 C 和 D 成为元素 B 的子元素:
<G><A>aaa</A><B><C>ccc</C><D>ddd</D></B><E>eee</E></G>
或者,可以指定 XML GENERATE 语句的 ATTRIBUTES 短语。 ATTRIBUTES 短语将生成的 XML 文档中包含的每个合格数据项表示为包含 XML 元素的属性,而不是包含 XML 元素的子元素。 要符合条件,数据项必须是基本的,名称必须不是 FILLER,并且其数据描述条目中不得包含 OCCURS 子句。 包含的 XML 元素对应于直接取代基本数据项的组数据项。 (可选) 您可以使用 TYPE OF 短语来指定更精确地控制哪些数据项应表示为属性或元素。
例如,假设前一个程序摘录中的 XML GENERATE 语句被编码为:
XML Generate Doc from G with attributes
然后,该代码将生成以下 XML 文档,其中 A 和 E 表示为元素 G的属性, C 和 D 将成为元素 B的属性:
<G A="aaa" E="eee"><B C="ccc" D="ddd"></B></G>
(可选) 您可以对 XML
GENERATE 语句的 ENCODING 短语进行编码,以指定生成的 XML 文档的 encoding 。 如果不使用 ENCODING 短语,那么文档编码由接收数据项的类别确定。 如需了解更多信息,请参阅以下关于控制生成的 XML 输出编码的相关任务。
(可选) 您可以对 XML-DECLARATION 短语进行编码,以使生成的 XML 文档具有包含版本信息和编码声明的 XML 声明。 如果接收数据项属于类别:
- 本地: 编码声明具有值
UTF-16(encoding="UTF-16")。 - 字母数字: 编码声明派生自
ENCODING短语 (如果已指定) ,或者从 运行时语言环境或 IBMIC_CODEPAGE 环境变量 (如果未指定ENCODING短语)。
例如,以下程序节选指定 XML-DECLARATION 短语为 XML GENERATE ,并指定使用 UTF-8 编码:
01 Greeting.
05 msg pic x(80) value 'Hello, world!'.
. . .
XML Generate Doc from Greeting
with Encoding "UTF-8"
with XML-declaration
End-XML
之前的代码生成以下XML文档:
<?xml version="1.0" encoding="UTF-8"?><Greeting><msg>Hello, world!</msg></Greeting>
如果未对 XML-DECLARATION 短语进行编码,那么不会生成 XML 声明。
(可选) 您可以对 NAMESPACE 短语进行编码,以便为生成的 XML 文档指定 名称空间 。 命名空间值必须是一个有效的统一资源标识符(URI) ,例如 URL (统一资源定位符);更多信息,请参阅有关 URI 语法的相关概念。
在类别本地或字母数字的标识或文字中指定名称空间。
如果指定了名称空间,但没有指定名称空间前缀,则该名称空间将成为文档的默认名称空间。 即,缺省情况下,根元素上的名称空间 define 将应用于文档中的每个元素名称 (包括根元素)。
例如,请考虑以下数据定义和 XML
GENERATE 语句:
01 Greeting.
05 msg pic x(80) value 'Hello, world!'.
01 NS pic x(20) value 'http://example'.
. . .
XML Generate Doc from Greeting
namespace is NS
生成的 XML 文档具有缺省名称空间 (http://example) ,如下所示:
<Greeting xmlns="http://example"><msg>Hello, world!</msg></Greeting>
如果未指定名称空间,那么生成的 XML 文档中的元素名称不在任何名称空间中。
(可选) 您可以对 NAMESPACE-PREFIX 短语进行编码,以指定要应用于所生成文档中每个元素的开始和结束标记的前缀。 只有在前一个XML文档中指定了命名空间后,才能指定前缀。
执行 XML GENERATE 语句时,前缀值必须是一个有效的 XML 名称,但不带冒号 (:);详情请参见命名空间的相关参考资料。 该值可以具有尾部空格,在使用前缀之前将除去这些空格。
在国家或字母数字类别的标识或字面值中指定名称空间前缀。
建议前缀简短,因为它限定了每个元素的开始和结束标记。
例如,请考虑以下数据定义和 XML GENERATE 语句:
01 Greeting.
05 msg pic x(80) value 'Hello, world!'.
01 NS pic x(20) value 'http://example'.
01 NP pic x(5) value 'pre'.
. . .
XML Generate Doc from Greeting
namespace is NS
namespace-prefix is NP
生成的 XML 文档具有显式名称空间 (http://example) ,并且前缀 pre 将应用于元素 Greeting 和 msg的开始和结束标记,如下所示:
<pre:Greeting xmlns:pre="http://example"><pre:msg>Hello, world!</pre:msg></pre:Greeting>
(可选) 您可以对 NAME 短语进行编码,以在生成的 XML 文档中指定属性和元素名称。 属性和元素名称必须是字母数字或本地文字,并且必须是符合 XML 1.0 标准的合法名称。
例如,请考虑以下数据结构和 XML GENERATE 语句:
01 Msg.
02 Msg-Severity pic 9 value 1.
02 Msg-Date pic 9999/99/99 value "2012/04/12".
02 Msg-Text pic X(50) value "Sell everything!".
01 Doc pic X(500).
XML Generate Doc from Msg
With attributes
Name of Msg is "Message"
Msg-Severity is "Severity"
Msg-Date is "Date"
Msg-Text is "Text"
End-XML
生成的 XML 文档如下所示:
<Message Severity="1" Date="2012/04/12" Text="Sell everything!"></Message> (可选) 您可以对 SUPPRESS 短语进行编码,以指定是否根据单个数据项是否满足特定条件来生成这些数据项。
例如,考虑以下数据结构和 XML GENERATE 语句以禁止空格和零:
01 G.
02 SensitiveInfo.
03 SSN pic x(11) value '123-45-6789'.
03 HomeAddress pic x(50) value '123 Main St, Anytown, USA'.
02 Aarray value spaces.
03 A pic AAA occurs 5.
02 Barray value spaces.
03 B pic XXX occurs 5.
02 Carray value zeros.
03 C pic 999 occurs 5.
Move 'abc' to A(1)
Move 123 to C(3)
XML Generate Doc from G
Suppress SensitiveInfo
every nonnumeric element when space
every numeric element when zero
End-XML生成的 XML 文档如下所示:
<G>
<Aarray><A>abc</A></Aarray>
<Carray><C>123</C></Carray>
</G>(可选) 您可以使用 TYPE OF 短语来指定是将个别数据项表示为属性,元素还是内容。
例如,请考虑以下数据结构和 XML GENERATE 语句:
01 Msg.
02 Msg-Severity pic 9 value 1.
02 Msg-Date pic 9999/99/99 value "2012/04/12".
02 Msg-Text pic X(50) value "Sell everything!".
01 Doc pic X(500).
XML Generate Doc from Msg
With attributes
Type of Msg-Severity is attribute
Msg-Date is attribute
Msg-Text is element
End-XML生成的 XML 文档如下所示:
<Msg Msg-Severity="1" Msg-Date="2012/04/12">
<Msg-Text>Sell everything!</Msg-Text></Msg>ON EXCEPTION,用于在 XML 生成期间发生错误时接收控制NOT ON EXCEPTION,用于在未发生错误时接收控制
您可以使用显式作用域终止符 END-XML结束 XML GENERATE 语句。 编码 END-XML 以嵌套在条件语句中具有 ON
EXCEPTION 或 NOT ON EXCEPTION 短语的 XML GENERATE 语句。
XML 生成工作一直持续到 COBOL 源记录转换为 XML 或出现错误为止。 如果发生错误,结果如下:
XML-CODE专用寄存器包含非零异常代码。- 控件将传递到
ON EXCEPTION短语 (如果指定) ,否则传递到XML GENERATE语句的末尾。
如果在 XML 生成期间未发生任何错误,那么 XML-CODE 专用寄存器包含零,如果指定了 NOT ON
EXCEPTION 短语,那么会将控制权传递给该短语,否则传递到 XML
GENERATE 语句的末尾。