Парсер XML на Cobol

Для обработки данных в формате XML, Cobol предоставляет достаточно удобное средство парсинга. Поговаривают, что скорость его работы гораздо выше скорости работы парсера, появившегося в последних версиях Enterprise PL/I. Не знаю, не сравнивал =) Итак, начнем с кода программы: ****************************************************************** * This program parses input data using standart XML parser and * * returns parsed data back to calling process * ****************************************************************** IDENTIFICATION DIVISION. PROGRAM-ID. MYPROG1. AUTHOR. My Name DATE-WRITTEN. Current Date DATA DIVISION. *----------------------------------------------------------------* * Declare variables and structures * *----------------------------------------------------------------* WORKING-STORAGE SECTION. 01 XML-LENGTH PIC S9(4) COMP. 01 XML-CONTENT PIC X(31988). 01 XML-TYPE PIC X(30). 01 TAGS-ARRAY. 02 CURRENT-TAG PIC X(50) OCCURS 2 TIMES. 01 CURRENT-LEVEL PIC S9(4) COMP. 01 TEMP-STR PIC X(20800) VALUE SPACES. 01 TEMP-STR-POS PIC 99999 VALUE 1. 01 TEMP-EXT-DES PIC X(03). 01 TEMP-LAN-COD PIC X(02). LINKAGE SECTION. *----------------------------------------------------------------* * The LINKAGE SECTION describes data made available from another * * program or method * *----------------------------------------------------------------* * Input XML document structure: * *----------------------------------------------------------------* 01 INPUT-DATA. 02 XML-DOC PIC X(32000). *----------------------------------------------------------------* * Ouput data that will be sent to calling program: * *----------------------------------------------------------------* 01 OUTPUT-DATA. 02 XML-DATA PIC X(300). *----------------------------------------------------------------* * Structure for parsed XML data : * *----------------------------------------------------------------* 02 parsedXMLdata REDEFINES XML-DATA. 03 field1 PIC X(100). 03 field2 PIC X(100). 03 field3 PIC X(100). PROCEDURE DIVISION USING IMS-TRIGGER OUTPUT-DATA. *----------------------------------------------------------------* * MAIN procedure: * *----------------------------------------------------------------* MAINLINE SECTION. * Init parameters * MOVE SPACES TO OUTPUT-DATA MOVE SPACES TO TAGS-ARRAY MOVE 0 TO CURRENT-LEVEL MOVE XML-DOC OF IMS-TRIGGER TO XML-CONTENT * Parse XML-CONTENT using standart COBOL parser * XML PARSE XML-CONTENT PROCESSING PROCEDURE XML-HANDLER END-XML * Return back to the calling program * GOBACK. *----------------------------------------------------------------* * XML-HANDLER procedure: * *----------------------------------------------------------------* XML-HANDLER SECTION. EVALUATE XML-EVENT * Process START-OF-ELEMENT event * WHEN 'START-OF-ELEMENT' * Increment CURRENT-LEVEL by 1 * COMPUTE CURRENT-LEVEL = CURRENT-LEVEL + 1 * If current level is less than 3 * IF CURRENT-LEVEL < 3 THEN * Store uppercased XML element value * MOVE FUNCTION UPPER-CASE(XML-TEXT) TO CURRENT-TAG(CURRENT-LEVEL) END-IF * If the first level is processed * IF CURRENT-LEVEL = 1 THEN * Set default value to TEMP-STR-POS variable * MOVE 1 TO TEMP-STR-POS * Fill TEMP-STR variable with blanks * MOVE SPACES TO TEMP-STR * Store tag name * MOVE CURRENT-TAG(1) TO XML-TYPE END-IF * Process CONTENT-CHARACTERS event * WHEN 'CONTENT-CHARACTERS' * Call procedure TAGS-PROCESSING to process XML data * PERFORM TAGS-PROCESSING * Process END-OF-ELEMEN event * WHEN 'END-OF-ELEMENT' * If current level is less than 3 * IF CURRENT-LEVEL < 3 THEN * Fill CURRENT-TAG(CURRENT-LEVEL) with blanks * MOVE SPACES TO CURRENT-TAG(CURRENT-LEVEL) END-IF * Decrement CURRENT-LEVEL by 1 * COMPUTE CURRENT-LEVEL = CURRENT-LEVEL - 1 * Process END-OF-DOCUMENT evend * WHEN 'END-OF-DOCUMENT' * Process EXCEPTION event * WHEN 'EXCEPTION' IF XML-CODE >= 50 AND XML-CODE <= 99 THEN MOVE 0 TO XML-CODE END-IF IF XML-CODE >= 100001 AND XML-CODE <= 165535 THEN COMPUTE XML-CODE = XML-CODE - 100000 END-IF IF XML-CODE >= 200001 AND XML-CODE <= 265535 THEN COMPUTE XML-CODE = XML-CODE - 200000 END-IF END-EVALUATE . *----------------------------------------------------------------* * Process XML tags * *----------------------------------------------------------------* TAGS-PROCESSING SECTION. IF CURRENT-LEVEL = 2 THEN EVALUATE XML-TYPE *----------------------------------------------------------------* * PARSE FOR "parsedXMLdatata" * *----------------------------------------------------------------* WHEN 'REQUEST' EVALUATE CURRENT-TAG(CURRENT-LEVEL) WHEN 'FIELD1' MOVE FUNCTION UPPER-CASE(XML-TEXT) TO field1 OF parsedXMLdata WHEN 'FIELD2' MOVE FUNCTION UPPER-CASE(XML-TEXT) TO field2 OF parsedXMLdata WHEN 'FIELD3' MOVE FUNCTION UPPER-CASE(XML-TEXT) TO field3 OF parsedXMLdata END-EVALUATE END-EVALUATE END-IF . Для того, чтобы адаптировать эту программу под свои нужны, необходимо поменять структуру parsedXMLdata, которая будет возвращена вызывающему процессу и в которой будут содержаться данные их входного XML. В блок EVALUATE CURRENT-TAG(CURRENT-LEVEL) необходимо добавить обработку реальных полей XML сообщения. При вызове программы необходимо передавать два параметра - строка со входным XML сообщением и буфер для записи результатов парсинга (выходной параметр).Air Jordan XI 11 Shoes

Отправить комментарий

  • Доступны HTML теги: <b> <i> <u> <br> <hr> <div> <span> <code> <pre>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <pli>.

Подробнее о форматировании

  _  _     ____  
| || | | ___|
| || |_ |___ \
|__ _| ___) |
|_| |____/
Enter the code depicted in ASCII art style.