XML et RPG

 

Soit une liste de nos cours en XML

(voir le fichier complet, le source du pgm ayant réalisé cela)

Voici la manière dont RDI, montre ce fichier :

Les règles du jeu XML


Elles sont extrêmement simples. Les informations doivent être :

Le code Opération XML-INTO (V5R40) permet de lire un flux XML

- A partir d'une variable ou d'un fichier IFS
- dans une variable ou en indiquant une procédure à appeler
      XML-INTO récepteur %XML(origine : 'options') 


le récepteur peut-être 

Options valides (le défaut est souligné)

doc
doc=string
doc=file 
string : la source est une variable contenant du XML

file : la source est dans un fichier de l'IFS
case
case=lower
case=upper 
case=any  
case=convert 
lower  : le flux XML est en minuscules
upper  : le flux est en majuscules
any    : le flux XML doit être converti avant d'être traité
convert: les caractères invalides (- par ex.) sont remplacés par _ (tiret bas)
trim
trim=all
trim=none
all    : les espaces d'extrémité des chaînes sont enlevés
none   : les espaces d'extrémité des chaînes sont conservés
allowmissing
allowmissing=no
allowmissing=yes
peut-il y avoir des sous-zones de DS en plus ? 
(c.a.d n'ayant pas d'équivalent en tant qu'élément XML )
allowextra
allowextra=no
allowextra=yes
peut-il y avoir des éléments XML en trop ? 
(c.a.d n'ayant pas d'équivalent en tant que sous zone de la DS )
path path=/ Chemin de l'élément à extraire (par défaut la racine)

A utiliser si la DS ne se nomme par comme l'élément principal
datasubf   permet de traiter un élément XML contenant des attributs ET une valeur

Par exemple
<cours nom="XML"  module="PGM">
   manipuler du XML en RPG
</cours>
datasubf=text, permet de placer "manipuler du XML en RPG" dans la zone nommée TEXT
countprefix   permet de recevoir le nombre d'élément extrait dans un compteur

Par exemple countprefix=nbr, si on parse un élément nommé cours et présent trois fois,
place la valeur 3 dans nbrcours
ns   gestion des espaces de nommage (par exemple VNS:Cours pour "qualifier" cours)

ns=remove -> retrait de l'espace de nommage : on cherche une DS nommée COURS
ns=merge   -> ajout de l'espace de nommage (avec _) on cherche une DS VNS_COURS
nsprefix   récupération de l'espace de nommage

nsprefix=ns, on cherche une variable nommée NS_COURS, dans laquelle placer la chaîne "VNS"

Quelques exemples de code



Debug

Utilisation de PATH


Éléments ET attributs, sont traités de la même manière


Debug


Imbrication (avec LIKEDS)


Debug


Éléments présents n fois (occurrences)


Définitions


Résultat


Si cours avait été défini DIM(10) , soit plus que le nombre d'occurrences réel, il fallait l'option allowmissing

XML stocké dans un fichier (doc=file)



Le fichier contient plus de 500 cours ==> allowextra





Pour traiter une nombre infini d'occurrences, il faut passer par un %handler()

Le principe est de définir comme réceptacle de la fonction xml-into, non pas une DS, mais une procédure (s/pgm ILE)

La procédure

•retourne

•reçoit

La DS reçue par la procédure


La procédure (qui en fait est en fin de source)


Le programme principal



Une autre solution, aujourd'hui consiste à faire faire le travail par SQL

XMLTABLE

Fonction Table qui traite sous forme colonnée (relationnelle), les éléments d'un flux XML. La source peut être :

      
SELECT X.NOM, X.RUE, X.TEL  FROM
    XMLTABLE ('$c/customerinfo' passing <source> as "c" 
   COLUMNS
      NOM   CHAR(30)    PATH 'name', -- élément
      RUE   VARCHAR(25) PATH 'addr/street', -- élément imbriqué dans addr
      TEL   VARCHAR(20) PATH '@tel' -- attribut
 ) AS X
 

Si le XML n'est pas une colonne base de données de type XML , il faut utiliser XMLPARSE( )
 
 select * from XMLTABLE(
      '$r/catalog/book' PASSING XMLPARSE(DOCUMENT GET_XML_FILE('/formation/books.xml') ) as "r"
 COLUMNS 
    ID char(5) PATH '@id',
    auteur char(10) PATH 'author',
    titre char(50) PATH 'title'
 ) as txml;

Exemple d'utilisation en RPG


Cet exemple, illustre l'utilisation d'un curseur afin de retrouver la totalité des lignes.

Dans notre TP, nous aurions pu demander à SQL de réaliser l'ensemble du traitement


SQL sait aussi lire du JSON


Pour un traitement du format JSON par RPG, voyez le projet YAJL ou bien utilisez Data-Into



Nouveau code opération RPG Data-Into (TR4) , mariant XML-INTO et la notion de Handler de Rpg Open Access

Voyez comment le produit Open source YAJL s'est adapté à ce nouveau code opération.