生成 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文档,其中 ABE 作为元素 G 的子元素,而 CD 成为元素 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 文档,其中 AE 表示为元素 G的属性, CD 将成为元素 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 将应用于元素 Greetingmsg的开始和结束标记,如下所示:

<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>
此外,您可以指定以下任一短语或同时指定以下两个短语以在生成 XML 文档后接收控制:
  • ON EXCEPTION,用于在 XML 生成期间发生错误时接收控制
  • NOT ON EXCEPTION,用于在未发生错误时接收控制

您可以使用显式作用域终止符 END-XML结束 XML GENERATE 语句。 编码 END-XML 以嵌套在条件语句中具有 ON EXCEPTIONNOT ON EXCEPTION 短语的 XML GENERATE 语句。

XML 生成工作一直持续到 COBOL 源记录转换为 XML 或出现错误为止。 如果发生错误,结果如下:

  • XML-CODE 专用寄存器包含非零异常代码。
  • 控件将传递到 ON EXCEPTION 短语 (如果指定) ,否则传递到 XML GENERATE 语句的末尾。

如果在 XML 生成期间未发生任何错误,那么 XML-CODE 专用寄存器包含零,如果指定了 NOT ON EXCEPTION 短语,那么会将控制权传递给该短语,否则传递到 XML GENERATE 语句的末尾。

示例:生成XML

相关参考资料
XML GENERATE 语句( COBOL for Linux® on x86 语言参考资料
可扩展标记语言(XML)
XML 中的命名空间 1.0