Example: enhancing XML output

The following example shows how you can modify XML output.

Consider the following data structure. The XML that is generated from the structure suffers from several problems that can be corrected.


01  CDR-LIFE-BASE-VALUES-BOX.
    15  CDR-LIFE-BASE-VAL-DATE    PIC X(08).
    15  CDR-LIFE-BASE-VALUE-LINE  OCCURS  2 TIMES.
        20  CDR-LIFE-BASE-DESC.
            25 CDR-LIFE-BASE-DESC1 PIC X(15).
            25  FILLER             PIC X(01).
            25  CDR-LIFE-BASE-LIT  PIC X(08).
            25  CDR-LIFE-BASE-DTE  PIC X(08).
        20  CDR-LIFE-BASE-PRICE.
            25  CDR-LIFE-BP-SPACE  PIC 9(08).
            25  CDR-LIFE-BP-DASH   PIC X.
            25  CDR-LIFE-BP-SPACE1 PIC X(02).
        20  CDR-LIFE-BASE-PRICE-ED  REDEFINES
             CDR-LIFE-BASE-PRICE  PIC $$$.$$.
        20  CDR-LIFE-BASE-QTY.
            25  CDR-LIFE-QTY-SPACE   PIC X(08).
            25  CDR-LIFE-QTY-DASH    PIC X.
            25  CDR-LIFE-QTY-SPACE1  PIC X(03).
            25  FILLER               PIC X(02).
        20  CDR-LIFE-BASE-VALUE   PIC $$$9.99
            BLANK WHEN ZERO.
    15  CDR-LIFE-BASE-TOT-VALUE   PIC X(15)

When this data structure is populated with some sample values, and XML is generated directly from it and then formatted using program Pretty (shown in Example: generating XML), the result is as follows:


<CDR-LIFE-BASE-VALUES-BOX>
  <CDR-LIFE-BASE-VAL-DATE>01/02/03</CDR-LIFE-BASE-VAL-DATE>
  <CDR-LIFE-BASE-VALUE-LINE>
    <CDR-LIFE-BASE-DESC>
      <CDR-LIFE-BASE-DESC1>First</CDR-LIFE-BASE-DESC1>
      <CDR-LIFE-BASE-LIT> </CDR-LIFE-BASE-LIT>
      <CDR-LIFE-BASE-DTE>01/01/01</CDR-LIFE-BASE-DTE>
    </CDR-LIFE-BASE-DESC>
    <CDR-LIFE-BASE-PRICE>
      <CDR-LIFE-BP-SPACE>23</CDR-LIFE-BP-SPACE>
      <CDR-LIFE-BP-DASH>.</CDR-LIFE-BP-DASH>
      <CDR-LIFE-BP-SPACE1>00</CDR-LIFE-BP-SPACE1>
    </CDR-LIFE-BASE-PRICE>
    <CDR-LIFE-BASE-QTY>
      <CDR-LIFE-QTY-SPACE>123</CDR-LIFE-QTY-SPACE>
      <CDR-LIFE-QTY-DASH>.</CDR-LIFE-QTY-DASH>
      <CDR-LIFE-QTY-SPACE1>000</CDR-LIFE-QTY-SPACE1>
    </CDR-LIFE-BASE-QTY>
    <CDR-LIFE-BASE-VALUE>$765.00</CDR-LIFE-BASE-VALUE>
  </CDR-LIFE-BASE-VALUE-LINE>
  <CDR-LIFE-BASE-VALUE-LINE>
    <CDR-LIFE-BASE-DESC>
      <CDR-LIFE-BASE-DESC1>Second</CDR-LIFE-BASE-DESC1>
      <CDR-LIFE-BASE-LIT> </CDR-LIFE-BASE-LIT>
      <CDR-LIFE-BASE-DTE>02/02/02</CDR-LIFE-BASE-DTE>
    </CDR-LIFE-BASE-DESC>
    <CDR-LIFE-BASE-PRICE>
      <CDR-LIFE-BP-SPACE>34</CDR-LIFE-BP-SPACE>
      <CDR-LIFE-BP-DASH>.</CDR-LIFE-BP-DASH>
      <CDR-LIFE-BP-SPACE1>00</CDR-LIFE-BP-SPACE1>
    </CDR-LIFE-BASE-PRICE>
    <CDR-LIFE-BASE-QTY>
      <CDR-LIFE-QTY-SPACE>234</CDR-LIFE-QTY-SPACE>
      <CDR-LIFE-QTY-DASH>.</CDR-LIFE-QTY-DASH>
      <CDR-LIFE-QTY-SPACE1>000</CDR-LIFE-QTY-SPACE1>
    </CDR-LIFE-BASE-QTY>
    <CDR-LIFE-BASE-VALUE>$654.00</CDR-LIFE-BASE-VALUE>
  </CDR-LIFE-BASE-VALUE-LINE>
  <CDR-LIFE-BASE-TOT-VALUE>Very high!</CDR-LIFE-BASE-TOT-VALUE>
</CDR-LIFE-BASE-VALUES-BOX>

This generated XML suffers from several problems:

  • The element names are long and not very meaningful.
  • Some fields that are elements should be attributes such as, CDR-LIFE-BASE-VAL-DATE and CDR-LIFE-BASE-DESC1.
  • There is unwanted data, for example, CDR-LIFE-BASE-LIT and CDR-LIFE-BASE-DTE.
  • Required data has an unnecessary parent. For example, CDR-LIFE-BASE-DESC1 has parent CDR-LIFE-BASE-DESC.
  • Other required fields are split into too many subcomponents. For example, CDR-LIFE-BASE-PRICE has three subcomponents for one amount.
These and other characteristics of the XML output can be remedied by using additional phrases of the XML GENERATE statement as follows:
  • Use the NAME OF phrase to provide appropriate tag or attribute names.
  • Use the TYPE OF … IS ATTRIBUTE phrase to select the fields which should be XML attributes rather than elements.
  • Use the TYPE OF … IS CONTENT phrase to suppress tags for excessive subcomponents.
  • Use the SUPPRESS … WHEN phrase to exclude fields that contain uninteresting values.

Here is an example of the XML GENERATE statement to address those problems:


XML generate Doc from CDR-LIFE-BASE-VALUES-BOX
  Count in tally
  Name of
          CDR-LIFE-BASE-VALUES-BOX
       is 'Base_Values'
          CDR-LIFE-BASE-VAL-DATE
       is 'Date'
          CDR-LIFE-BASE-DTE
       is 'Date'
          CDR-LIFE-BASE-VALUE-LINE
       is 'BaseValueLine'
          CDR-LIFE-BASE-DESC1
       is 'Description'
          CDR-LIFE-BASE-PRICE
       is 'BasePrice'
          CDR-LIFE-BASE-QTY
       is 'BaseQuantity'
          CDR-LIFE-BASE-VALUE
       is 'BaseValue'
          CDR-LIFE-BASE-TOT-VALUE
       is 'TotalValue'
  Type of
          CDR-LIFE-BASE-VAL-DATE is attribute
          CDR-LIFE-BASE-DESC1 is attribute
          CDR-LIFE-BP-SPACE   is content
          CDR-LIFE-BP-DASH    is content
          CDR-LIFE-BP-SPACE1  is content
          CDR-LIFE-QTY-SPACE  is content
          CDR-LIFE-QTY-DASH   is content
          CDR-LIFE-QTY-SPACE1 is content
  Suppress every nonnumeric when space
           every numeric when zero

The result of generating and formatting XML from the statement shown above is more usable:


<Base_Values Date="01/02/03">
  <BaseValueLine Description="First">
    <Date>01/01/01</Date>
    <BasePrice>23.00</BasePrice>
    <BaseQuantity>123.000</BaseQuantity>
    <BaseValue>$765.00</BaseValue>
  </BaseValueLine>
  <BaseValueLine Description="Second">
    <Date>02/02/02</Date>
    <BasePrice>34.00</BasePrice>
    <BaseQuantity>234.000</BaseQuantity>
    <BaseValue>$654.00</BaseValue>
  </BaseValueLine>
  <TotalValue>Very high!</TotalValue>
</Base_Values>

Note that the COBOL reserved word DATE can now be used as an XML tag name in the output and other characters that are illegal to use in COBOL data names, such and underscore _ can also be used.

Note that the COBOL reserved word DATE can now be used as an XML tag name in the output. Characters such as accented letters and period . that are illegal in single-byte data names can also be used.

Related references  
Operation of XML GENERATE (COBOL for Linux® on x86 Language Reference)  
REPLACE statement (COBOL for Linux on x86 Language Reference)