In the current release of OS/400 (V5R4 as of this writing), IBM introduced XML parsing (reading XML data) in RPG IV. But it's up to the RPG programmer to create XML. However, there are rumors that IBM may introduce XML creation in RPG IV with the next release of the operating system.
Regardless of whether you use your own routine to create XML, use the routines in RPG xTools, or wait for OS/400 V5R5 to use the native RPG IV routines, one problem that will still be there is escaping the XML.
Unlike URL-encoded strings, most data can be embedded in XML as plain text. This is true for all but five special characters that are used for XML itself. For example, what if your XML data contains the following string?
Are those tags part of the XML or part of the data in the XML? If they are part of the data in the XML, they need to be escaped. This means they need to appear as follows:
RPG provides no support for escaping XML; therefore, we need to write our own routine to escape data used in XML. The popular (and free) iSockets service program includes an ESCAPEXML subprocedure that does this for us. The ESCAPEXML subprocedure uses a simple FOR loop to escape the XML text. When it detects a less-than sign (<), a greater-than sign (>), and ampersand (&), double quotes ("), or single quotes ('), it converts them to their corresponding symbolic names.
An example of calling ESCAPEXML to escape the above example follows:
C callp escapeXML('iSeriesTV.com':myXML:
In this example, the data is sent to ESCAPEXML, and it is then escaped and returned to the MYXML variable. The XML itself is not sent to the ESCAPEXML procedure. So before wrapping your data in XML, escape it.
Certainly, the data would normally be stored in a variable and passed on the first parameter of the ESCAPEXML procedure.
The code listed below is the actual ESCAPEXML subprocedure code from the iSockets service program, so if you're using iSockets, you don't need to key in this code.
** (C) COPYRIGHT 2006 – R. Cozzi, Jr. All Rights reserved.
** Download iSockets at www.iSockets.net
D escapeXML PI 10I 0
D szXMLIn 65535A Value Varying
D szXMLOut 65535A OPTIONS(*VARSIZE:*NOPASS:*OMIT)
D nOutLen 10I 0 Const OPTIONS(*NOPASS:*OMIT)
D i S 10I 0
D o S 10I 0
D bP1 S 10I 0
D bP2 S 10I 0
D bP3 S 10I 0
C if %Parms >= 1
C CallP IsParmOmit(bP1 : 1 : *OMIT)
C if %Parms >= 2
C CallP IsParmOmit(bP2 : 2 : *OMIT)
C if %Parms >= 3
C CallP IsParmOmit(bP3 : 3 : *OMIT)
C eval o = 1
C for i = 1 to %len(szXMLIn)
C When %subst(szXMLIn:i:1) = '<'
C eval %subst(szXMLOut:o:4) = '<'
C eval o = o + 4
C When %subst(szXMLIn:i:1) = '>'
C eval %subst(szXMLOut:o:4) = '>'
C eval o = o + 4
C When %subst(szXMLIn:i:1) = '&'
C eval %subst(szXMLOut:o:5) = '&'
C eval o = o + 5
C When %subst(szXMLIn:i:1) = '"'
C eval %subst(szXMLOut:o:6) = '"'
C eval o = o + 6
C When %subst(szXMLIn:i:1) = ''''
C eval %subst(szXMLOut:o:6) = '''
C eval o = o + 6
C eval %subst(szXMLOut:o:1) = %subst(szXMLIn:i:1)
C eval o = o + 1
C return o
P escapeXML E
With this subprocedure from iSockets, you can escape the hassle of escaping!Bob Cozzi is a programmer/consultant, writer/author, and software developer of the RPG xTools, a popular add-on subprocedure library for RPG IV. His book The Modern RPG Language has been the most widely used RPG programming book for nearly two decades. He, along with others, speaks at and runs the highly-popular RPG World conference for RPG programmers.