# Example 6 This example program demonstrates the basic structure of an RPG program utilizing RXS to validate sample XML against an XSD. Several methods are demonstrated, with both pass and fail outcomes. ### Free Format EX6.rpgle ```rpgle **FREE Ctl-Opt ActGrp(*Caller) BndDir('RXSBND') Option(*NoDebugIO) ExtBinInt(*Yes) DecEdit('0.') Text('Ex. 6 - XML XSD Validate'); /COPY QRPGLECPY,RXSCB Dcl-Ds TransmitDS LikeDS(RXS_TransmitDS_t); Dcl-Ds XsdValidateDS LikeDS(RXS_XsdValidationDS_t); Dcl-Ds PutStmfDS LikeDS(RXS_PutStmfDS_t); Dcl-Ds DeleteStmfDS LikeDS(RXS_DeleteStmfDS_t); Dcl-S request Like(RXS_Var64Kv_t); Dcl-S goodXml Like(RXS_Var64Kv_t); Dcl-S badXml Like(RXS_Var64Kv_t); Dcl-S xsd Like(RXS_Var64Kv_t); exsr Setup; // Test validation against URI (Expected Success) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = 'http://files.rpg-xml.com/example/xsdvalidate/validate.xsd'; if RXS_Validate( goodXml : XsdValidateDS ); RXS_JobLog( 'XML 1 Validated successfully'); else; RXS_JobLog( 'XML 1 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a field (Expected Success) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdPointer = %Addr( xsd : *DATA ); XsdValidateDS.XsdLength = %Len( xsd ); if RXS_Validate( goodXml : XsdValidateDS ); RXS_JobLog( 'XML 2 Validated successfully'); else; RXS_JobLog( 'XML 2 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a file (Expected Success) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = PutStmfDS.Stmf; if RXS_Validate( goodXml : XsdValidateDS ); RXS_JobLog( 'XML 3 Validated successfully'); else; RXS_JobLog( 'XML 3 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against URI (Expected Failure) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = 'http://files.rpg-xml.com/example/xsdvalidate/validate.xsd'; if RXS_Validate( badXml : XsdValidateDS ); RXS_JobLog( 'XML 4 Validated successfully'); else; RXS_JobLog( 'XML 4 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a field (Expected Failure) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdPointer = %Addr( xsd : *DATA ); XsdValidateDS.XsdLength = %Len( xsd ); if RXS_Validate( badXml : XsdValidateDS ); RXS_JobLog( 'XML 5 Validated successfully'); else; RXS_JobLog( 'XML 5 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a file (Expected Failure) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = PutStmfDS.Stmf; if RXS_Validate( badXml : XsdValidateDS ); RXS_JobLog( 'XML 6 Validated successfully'); else; RXS_JobLog( 'XML 6 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; exsr Cleanup; *INLR = *On; return; begsr Setup; // Get good XML to test validation RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.Uri = 'http://files.rpg-xml.com/example/xsdvalidate/success.xml'; TransmitDS.HTTPMethod = RXS_HTTP_METHOD_GET; request = *Blanks; goodXml = RXS_Transmit( request : TransmitDS ); // Get bad XML to test validation RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.Uri = 'http://files.rpg-xml.com/example/xsdvalidate/failure.xml'; TransmitDS.HTTPMethod = RXS_HTTP_METHOD_GET; request = *Blanks; badXml = RXS_Transmit( request : TransmitDS ); // Get XSD from remote URI RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.Uri = 'http://files.rpg-xml.com/example/xsdvalidate/validate.xsd'; TransmitDS.HTTPMethod = RXS_HTTP_METHOD_GET; request = *Blanks; xsd = RXS_Transmit( request : TransmitDS ); // Put the XSD in an IFS file RXS_ResetDS( PutStmfDS : RXS_DS_TYPE_PUTSTMF ); PutStmfDS.Stmf = '/tmp/rxs_xsd_validate.xsd'; PutStmfDS.StmfCcsid = RXS_CCSID_ISO88591; RXS_PutStmf( xsd : PutStmfDS ); endsr; begsr Cleanup; RXS_ResetDS( DeleteStmfDS : RXS_DS_TYPE_DELETESTMF ); DeleteStmfDS.Stmf = PutStmfDS.Stmf; RXS_ProcessStmf( DeleteStmfDS ); endsr; ``` ### Fixed Format FX_EX6.rpgle ```rpgle H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('RXSBND') OPTION(*NODEBUGIO) H EXTBININT(*YES) DECEDIT('0.') H TEXT('Fixed Format Ex. 6 - XML XSD Validate') /COPY QRPGLECPY,RXSCB D TransmitDS DS LikeDS(RXS_TransmitDS_t) D XsdValidateDS DS LikeDS(RXS_XsdValidationDS_t) D PutStmfDS DS LikeDS(RXS_PutStmfDS_t) D DeleteStmfDS DS LikeDS(RXS_DeleteStmfDS_t) D request S Like(RXS_Var64Kv_t) D goodXml S Like(RXS_Var64Kv_t) D badXml S Like(RXS_Var64Kv_t) D xsd S Like(RXS_Var64Kv_t) /FREE exsr Setup; // Test validation against URI (Expected Success) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = 'http://files.rpg-xml.com/example/xsdvalidate/validate.xsd'; if RXS_Validate( goodXml : XsdValidateDS ); RXS_JobLog( 'XML 1 Validated successfully'); else; RXS_JobLog( 'XML 1 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a field (Expected Success) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdPointer = %Addr( xsd : *DATA ); XsdValidateDS.XsdLength = %Len( xsd ); if RXS_Validate( goodXml : XsdValidateDS ); RXS_JobLog( 'XML 2 Validated successfully'); else; RXS_JobLog( 'XML 2 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a file (Expected Success) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = PutStmfDS.Stmf; if RXS_Validate( goodXml : XsdValidateDS ); RXS_JobLog( 'XML 3 Validated successfully'); else; RXS_JobLog( 'XML 3 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against URI (Expected Failure) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = 'http://files.rpg-xml.com/example/xsdvalidate/validate.xsd'; if RXS_Validate( badXml : XsdValidateDS ); RXS_JobLog( 'XML 4 Validated successfully'); else; RXS_JobLog( 'XML 4 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a field (Expected Failure) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdPointer = %Addr( xsd : *DATA ); XsdValidateDS.XsdLength = %Len( xsd ); if RXS_Validate( badXml : XsdValidateDS ); RXS_JobLog( 'XML 5 Validated successfully'); else; RXS_JobLog( 'XML 5 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; // Test validation against XSD in a file (Expected Failure) RXS_ResetDS( XsdValidateDS : RXS_DS_TYPE_XSDVALIDATION ); XsdValidateDS.XsdLocation = PutStmfDS.Stmf; if RXS_Validate( badXml : XsdValidateDS ); RXS_JobLog( 'XML 6 Validated successfully'); else; RXS_JobLog( 'XML 6 Validation failed'); RXS_JobLog( 'Validation Error #%s: %s' : %Char( XsdValidateDS.ValidationErrorCode ) : XsdValidateDS.ValidationErrorText ); endif; exsr Cleanup; *INLR = *On; return; begsr Setup; // Get good XML to test validation RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.Uri = 'http://files.rpg-xml.com/example/xsdvalidate/success.xml'; TransmitDS.HTTPMethod = RXS_HTTP_METHOD_GET; request = *Blanks; goodXml = RXS_Transmit( request : TransmitDS ); // Get bad XML to test validation RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.Uri = 'http://files.rpg-xml.com/example/xsdvalidate/failure.xml'; TransmitDS.HTTPMethod = RXS_HTTP_METHOD_GET; request = *Blanks; badXml = RXS_Transmit( request : TransmitDS ); // Get XSD from remote URI RXS_ResetDS( TransmitDS : RXS_DS_TYPE_TRANSMIT ); TransmitDS.Uri = 'http://files.rpg-xml.com/example/xsdvalidate/validate.xsd'; TransmitDS.HTTPMethod = RXS_HTTP_METHOD_GET; request = *Blanks; xsd = RXS_Transmit( request : TransmitDS ); // Put the XSD in an IFS file RXS_ResetDS( PutStmfDS : RXS_DS_TYPE_PUTSTMF ); PutStmfDS.Stmf = '/tmp/rxs_xsd_validate.xsd'; PutStmfDS.StmfCcsid = RXS_CCSID_ISO88591; RXS_PutStmf( xsd : PutStmfDS ); endsr; begsr Cleanup; RXS_ResetDS( DeleteStmfDS : RXS_DS_TYPE_DELETESTMF ); DeleteStmfDS.Stmf = PutStmfDS.Stmf; RXS_ProcessStmf( DeleteStmfDS ); endsr; /END-FREE ```