13 - RPGLE - XML processing

DURATION:
3 Hours
ID:
13
?>
PRICE
1,999.00

INSTRUCTORS:

Mrs.Lalitha
Junior Lecturer - Web Design

Categories

Advanced

Processing XML in RPGLE (RPG IV) involves parsing and generating XML documents. IBM iSeries provides tools and APIs to work with XML efficiently. Here are some common methods for XML processing in RPGLE:

1. Generating XML

You can generate XML by building the XML document as a string or using SQL functions.

Building XML as a String:

rpg

**FREE

DCL-S xmlString VARCHAR(1000);

// Start XML document

xmlString = ‘<?xml version=”1.0″ encoding=”UTF-8″?>’;

xmlString += ‘<customers>’;

// Add customer records

xmlString += ‘<customer>’;

xmlString += ‘<id>1001</id>’;

xmlString += ‘<name>John Doe</name>’;

xmlString += ‘</customer>’;

xmlString += ‘<customer>’;

xmlString += ‘<id>1002</id>’;

xmlString += ‘<name>Jane Smith</name>’;

xmlString += ‘</customer>’;

// End XML document

xmlString += ‘</customers>’;

// Output the XML

DSPLY xmlString;

*INLR = *ON;

RETURN;

Using SQL/XML Functions:

rpg

**FREE

EXEC SQL

  SET :xmlString = XMLSERIALIZE(

    XMLELEMENT(NAME “customers”,

      XMLAGG(

        XMLELEMENT(NAME “customer”,

          XMLELEMENT(NAME “id”, customer_id),

          XMLELEMENT(NAME “name”, customer_name)

        )

      )

    ) AS CLOB(1K) INCLUDING XMLDECLARATION

  )

  FROM customers;

DSPLY xmlString;

*INLR = *ON;

RETURN;

2. Parsing XML

Parsing XML can be done using the XML-INTO opcode, which reads XML data into a data structure.

Example XML:

xml

<customers>

  <customer>

    <id>1001</id>

    <name>John Doe</name>

  </customer>

  <customer>

    <id>1002</id>

    <name>Jane Smith</name>

  </customer>

</customers>

RPGLE Code:

rpg

**FREE

// Define data structures for XML parsing

DCL-DS customerDS;

  id INT(10);

  name CHAR(50);

END-DS;

DCL-DS customersDS DIM(2) LIKEDS(customerDS);

// XML document as string

DCL-S xmlString VARCHAR(1000);

xmlString = ‘<?xml version=”1.0″ encoding=”UTF-8″?>’;

xmlString += ‘<customers>’;

xmlString += ‘<customer>’;

xmlString += ‘<id>1001</id>’;

xmlString += ‘<name>John Doe</name>’;

xmlString += ‘</customer>’;

xmlString += ‘<customer>’;

xmlString += ‘<id>1002</id>’;

xmlString += ‘<name>Jane Smith</name>’;

xmlString += ‘</customer>’;

xmlString += ‘</customers>’;

// Parse the XML

XML-INTO customersDS %XML(xmlString);

// Display parsed data

DCL-S i INT(10);

FOR i = 1 TO %ELEM(customersDS);

  DSPLY ‘ID: ‘ + %CHAR(customersDS(i).id);

  DSPLY ‘Name: ‘ + customersDS(i).name;

ENDFOR;

*INLR = *ON;

RETURN;

3. Using SQL XML Functions

IBM iSeries also provides SQL/XML functions to query and manipulate XML data directly in SQL.

Querying XML Data:

rpg

**FREE

EXEC SQL

  SELECT XMLCAST(XMLQUERY(‘/customers/customer/name’ PASSING XMLPARSE(DOCUMENT :xmlString)) AS VARCHAR(50))

  INTO :customerName;

DSPLY customerName;

*INLR = *ON;

RETURN;

These methods allow you to handle XML data effectively in RPGLE, making it easier to integrate with modern web services and applications. If you have specific scenarios or need more detailed examples, feel free to ask!

RPGLE – Using C procedures to manipulate IFS files

Integrating C procedures in RPGLE (RPG IV) can be very powerful, especially for tasks like manipulating files in the Integrated File System (IFS) on IBM iSeries. By using C procedures, you can leverage existing C libraries and perform complex file operations. Here’s a guide on how to achieve this:

1. Create the C Program

First, you need to create a C program that includes the necessary functions to manipulate IFS files. Here’s an example of a C program that reads a file from the IFS and writes to another file.

C Program (ifs_ops.c):

c

#include <stdio.h>

// Function to read from an IFS file

void read_ifs_file(char *file_path) {

    FILE *file = fopen(file_path, “r”);

    char buffer[256];

    if (file == NULL) {

        printf(“Error: Could not open file %s\n”, file_path);

        return;

    }

    while (fgets(buffer, sizeof(buffer), file) != NULL) {

        printf(“%s”, buffer);

    }

    fclose(file);

}

// Function to write to an IFS file

void write_ifs_file(char *file_path, char *content) {

    FILE *file = fopen(file_path, “w”);

    if (file == NULL) {

        printf(“Error: Could not open file %s\n”, file_path);

        return;

    }

    fprintf(file, “%s”, content);

    fclose(file);

}

2. Compile the C Program

Compile the C program to create a shared object (e.g., ifs_ops.so).

sh

gcc -shared -o ifs_ops.so ifs_ops.c

3. Create RPGLE Program to Call C Procedures

In your RPGLE program, declare the C procedures using the EXTPROC keyword and call them as needed.

RPGLE Program (CALLC.rpgle):

rpg

**FREE

// Declare the C procedures

DCL-PR read_ifs_file EXTPROC(‘read_ifs_file’);

  file_path POINTER VALUE;

END-PR;

DCL-PR write_ifs_file EXTPROC(‘write_ifs_file’);

  file_path POINTER VALUE;

  content POINTER VALUE;

END-PR;

// Variables for file paths and content

DCL-S readFilePath VARCHAR(256) INZ(‘/home/user/readfile.txt’);

DCL-S writeFilePath VARCHAR(256) INZ(‘/home/user/writefile.txt’);

DCL-S content VARCHAR(256) INZ(‘Hello, this is a test content.’);

// Convert variables to pointers

DCL-S readFilePathPtr POINTER;

DCL-S writeFilePathPtr POINTER;

DCL-S contentPtr POINTER;

readFilePathPtr = %ADDR(readFilePath:1);

writeFilePathPtr = %ADDR(writeFilePath:1);

contentPtr = %ADDR(content:1);

// Call the C procedures

CALLP read_ifs_file(readFilePathPtr);

CALLP write_ifs_file(writeFilePathPtr: contentPtr);

*INLR = *ON;

RETURN;

Explanation

  • C Program (ifs_ops.c): This program contains two functions: read_ifs_file to read from an IFS file and write_ifs_file to write to an IFS file.
  • RPGLE Program (CALLC.rpgle): This program declares the C procedures with the EXTPROC keyword and calls them using CALLP.

Steps to Run the Programs

  1. Compile the C program to create the shared object file.
  2. Load the shared object on the IBM iSeries.
  3. Run the RPGLE program to call the C procedures and manipulate IFS files.

Using C procedures in RPGLE allows you to perform complex file operations and leverage the extensive capabilities of C libraries. If you have any specific requirements or need further details, feel free to ask!

Leave a Reply

Your email address will not be published. Required fields are marked *