RXS_Parse()
This subprocedure is used to set up XML parsing. Use of this subprocedure requires an XML handler subprocedure to also be written.
The events recognized by the XML parser are:
Event | Format | Example | ||
---|---|---|---|---|
Element Begin | > |
Request> |
||
Element Content | / |
Request/Item/ |
||
Element End | /> |
Request/> |
||
Attribute | @ |
Request/Item@Attribute |
The Element Content and Attribute events will return data, which can be retrieved with RXS_STR().
Subprocedure Prototype
|
|
|
Holds the XML data to be passed to the parsing subprocedure(s). Will be ignored if the Stmf subfield of the DS parameter is set. |
|
Holds a RXS_ParseDS_t data structure which controls how RXS_Parse() functions. |
Example Code
*--------------------------------------------------------------
* This example parses a simple XML structure stored in the field
* 'XML' and stores the data contained in nodes <Node1> and <Node2>
* in the corresponding global fields.
*
* At a high level, the XML is passed into the XmlHandler()
* subprocedure in small chunks. Then, a SELECT block is used to
* detect whether or not the current chunk of XML matches one
* you'd like to handle. If it does, you can extract the data from
* an element of attribute using RXS_STR().
*
* Once the XML has been entirely passed through XmlHander(), control
* returns to the main part of the program.
*--------------------------------------------------------------
H DFTACTGRP(*NO) BNDDIR('RXSBND') ACTGRP(*CALLER)
/copy QRPGLECPY,RXSCB
D XmlHandler PR
D pType 10A Value
D pXPath 1024A Value Varying
D pData * Value
D pDataLen 10I 0 Value
D ParseDS DS LikeDS(RXS_ParseDS_t)
D Inz(*LikeDS)
D XML S Like(RXS_Var64Kv_t)
D Node1 S Like(RXS_Var1Kv_t)
D Node2 S Like(RXS_Var1Kv_t)
/free
XML = '<?xml version="1.0" encoding="utf-8"?>' +
'<Root><Node1>Hello</Node1><Node2>World</Node2></Root>';
reset ParseDS;
ParseDS.GlobalHandler = %Paddr( XmlHandler );
RXS_Parse( XML : ParseDS );
RXS_JobLog( 'Node 1: %s' : Node1 );
RXS_JobLog( 'Node 2: %s' : Node2 );
*INLR = *ON;
/end-free
P XmlHandler B
D XmlHandler PI
D pType 10A Value
D pXPath 1024A Value Varying
D pData * Value
D pDataLen 10I 0 Value
/free
select;
when pXPath = '/Root/Node1/';
Node1 = RXS_STR( pData : pDataLen );
when pXPath = '/Root/Node2/';
Node2 = RXS_STR( pData : pDataLen );
endsl;
/end-free
P E
*--------------------------------------------------------------
* This example parses a simple XML structure stored in the field
* 'XML' and stores the data contained in nodes <Node1> and <Node2>
* in the corresponding global fields.
*
* At a high level, the XML is passed into the XmlHandler()
* subprocedure in small chunks. Then, a SELECT block is used to
* detect whether or not the current chunk of XML matches one
* you'd like to handle. If it does, you can extract the data from
* an element of attribute using RXS_STR().
*
* Once the XML has been entirely passed through XmlHander(), control
* returns to the main part of the program.
*--------------------------------------------------------------
H DFTACTGRP(*NO) BNDDIR('RXSBND') ACTGRP(*CALLER)
/define RXSV6R1
/copy QRPGLECPY,RXSCB
D XmlHandler PR
D pType 10A Value
D pXPath 1024A Value Varying
D pData * Value
D pDataLen 10I 0 Value
D ParseDS DS LikeDS(RXS_ParseDS_t)
D Inz(*LikeDS)
D XML S Like(RXS_Var64Kv_t)
D Node1 S Like(RXS_Var1Kv_t)
D Node2 S Like(RXS_Var1Kv_t)
/free
XML = '<?xml version="1.0" encoding="utf-8"?>' +
'<root><node1>Hello</node1><node2>World</node2></root>';
reset ParseDS;
ParseDS.GlobalHandler = %Paddr( XmlHandler );
RXS_Parse( XML : ParseDS );
RXS_JobLog( 'Node 1: %s' : Node1 );
RXS_JobLog( 'Node 2: %s' : Node2 );
*INLR = *ON;
/end-free
P XmlHandler B
D XmlHandler PI
D pType 10A Value
D pXPath 1024A Value Varying
D pData * Value
D pDataLen 10I 0 Value
/free
select;
when pXPath = '/root/node1/';
RXS_STR( Node1 : pData : pDataLen );
when pXPath = '/root/node2/';
RXS_STR( Node2 : pData : pDataLen );
endsl;
/end-free
P E
Data Structures
|
|
|
|
|
|
|
Holds a PROCPTR to an XmlHandler subprocedure used to handle all possible XML events. |
|
Holds a PROCPTR to an XmlHandler subprocedure which will only respond to XML content events. |
|
Holds a PROCPTR to an XmlHandler subprocedure which will only respond to XML begin events. |
|
Holds a PROCPTR to an XmlHandler subprocedure which will only respond to XML end events. |
|
Holds a PROCPTR to an XmlHandler subprocedure which will only respond to XML attribute events. |
|
Controls whether namespaces are factored into XML parsing - if RXS_NO, they will be ignored. |
|
Specifies the CCSID of the XML being parsed. |
|
Specifies the CCSID the parsed data will be converted to. |
|
Specifies an IFS path to an XML file to parse instead of the Input parm. |