Les règles du jeu XML
Elles sont extrêmement simples. Les informations doivent être :
- soit encadrées par des balises ouvrantes(ex. <LIVRE>) et fermantes (ex. </LIVRE>) (contrairement à HTML où ses ces dernières n'étaient pas toujours obligatoires). On parle alors d'éléments. Les éléments doivent s'imbriquer proprement les uns dans les autres : aucun chevauchement n'est autorisé. Les éléments vides sont permis, selon le format <ELEMENTVIDE/>.
- soit incluses à l'intérieur même des balises : on parle alors d'attributs. Exemple : <LIVRE SUJET="XML">. Ici l'attribut SUJET de l'élément LIVRE a la valeur "XML" . En XML, contrairement à HTML, les valeurs des entités doivent toujours être encadrées par des guillemets (simples ou doubles).
Exemple
Voici la manière dont RDP, montre ce fichier :
DB2 reconnaît les champs de type XML
commençons par la création d'une table avec le type de champs XML, tel que donné par la documentation
CREATE SCHEMA POSAMPLE;
SET CURRENT SCHEMA POSAMPLE;
CREATE TABLE CUSTOMER ( CID BIGINT NOT NULL PRIMARY KEY , INFO XML ) ;Les champs de type XML peuvent faire jusqu'à 2 Go, la totalité d'une ligne ne peut pas dépasser 3,5 Go.
Ils sont stockés dans le CCSID indiqué par SQL_XML_DATA_CCSID dans QAQQINI, UTF-8 (1208) par défaut.
Puis insertion de données, le parsing (la conversion CHAR -> XML) est automatique lors des insertions,
mais vous pouvez parser de manière explicite avec XMLPARSE() pour utiliser des options (voir cette fonction)
INSERT INTO Customer (Cid, Info) VALUES (1000,
'<customerinfo xmlns="http://posample.org" Cid="1000">
<name>Kathy Smith</name>
<addr country="Canada">
<street>5 Rosewood</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M6W 1E6</pcode-zip>
</addr>
<phone type="work">416-555-1358</phone>
</customerinfo>') INSERT INTO Customer (Cid, Info) VALUES (1002,
'<customerinfo xmlns="http://posample.org" Cid="1002">
<name>Jim Noodle</name>
<addr country="Canada">
<street>25 EastCreek</street>
<city>Markham</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N9C 3T6</pcode-zip>
</addr>
<phone type="work">905-555-7258</phone>
</customerinfo>') INSERT INTO Customer (Cid, Info) VALUES (1003,
'<customerinfo xmlns="http://posample.org" Cid="1003">
<name>Robert Shoemaker</name>
<addr country="Canada">
<street>1596 Baseline</street>
<city>Aurora</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X 7F8</pcode-zip>
</addr>
<phone type="work">905-555-2937</phone>
</customerinfo>')Mais aussi (voir la fonction GET_XML_FILE ici):
INSERT INTO POSAMPLE/CUSTOMER VALUES( 1004 , GET_XML_FILE('/temp/client04.xml') )
XML_TABLE permet de parser un flux XML
SELECT X.NOM, X.RUE, X.VILLE FROM Customer,
XMLTABLE ('$c/customerinfo' passing INFO as "c"
COLUMNS
NOM CHAR(30) PATH 'name',
RUE VARCHAR(25) PATH 'addr/street',
VILLE VARCHAR(25) PATH 'addr/city' )
AS X
Affiche
....+....1....+....2....+....3....+....4....+....5....+....6....+....7 NOM RUE VILLE Kathy Smith 5 Rosewood Toronto Jim Noodle 1150 Maple Drive Newtown Robert Shoemaker 1596 Baseline Aurora ******** Fin de données ********JSON
Aujourd'hui JSON est de plus en plus utilisé.
JSON (JavaScript Object Notation) est un format de données textuelles dérivé de la notation des objets du langage JavaScript (Wikipedia)
ce qui s'écrit comme cela en XML s'écrit comme cela en JSON <producteurs>
<producteur>
<numero>45</numero>
<commune>Reims</commune>
<appellation>13</appellation>
</producteur>
</producteurs>-> {
"producteurs": {
"producteur": {
"numero":45,
"commune":"Reims",
"appellation":13
}
}
}
D'ailleurs vous trouverez ici deux fonctions bien pratiques XML2JSON et JSON2XML écrites en Java.
Un élément peut contenir un objet, une valeur ou un tableau de valeurs, marqué alors par [ et ]
<PO> <id>103</id>
<orderDate>2014-06-20</orderDate>
<customer>
<cid>888</cid>
</customer> <items>
<item>
<partNum>872-AA</partNum>
<shipDate>2014-06-21</shipDate>
<productName>Lawnmower</productName>
<USPrice>749.99</USPrice>
<quantity>1</quantity>
</item>
<item>
<partNum>837-CM</partNum>
<productName>Digital Camera</productName>
<USPrice>199.99</USPrice>
<quantity>2</quantity>
<comment>2014-06-22</comment>
</item>
</items>
</PO>devient (remarquez le tableau de "item")
{ "PO":{ "id": 103, "orderDate": "2014-06-20", "customer": {"@cid": 888}, "items": { "item": [ { "partNum": "872-AA", "productName": "Lawnmower", "quantity": 1, "USPrice": 749.99, "shipDate": "2014-06-21" }, { "partNum": "837-CM", "productName": "Digital Camera", "quantity": 2, "USPrice": 199.99, "comment": "2014-06-22" } ] } } }résumé des caractères spéciaux :
- { et } début et fin d'un objet
- [ et ] début et fin d'un tableau
- : séparateur entre la clé et sa valeur
- , séparateur entre plusieurs paires de clé:valeur ou d'éléments
- Chaînes
- " marqueur de début et de fin de chaine
- \ caractère d'échapement
- le caractère " doit être précédé de \
- le caractère \ doit être précédé de \
- \b = backspace
- \f = form feed
- \n = line feed
- \r = carriage return (retour chariot)
- \t = tabulation
- Nombres
- saisis tel que (non encadré)
- peuvent être signés (-12)
- peuvent contenir un exposant (-1.2E5)
- Booléens
- true
- false
- Valeur nulle
- null
Il y a trois manières d'utiliser JSON sur IBM i :
- DB2nosql -- accès "nosql" en mode ligne de commandes
- Les API Java
- les fonctions SQL :
- SYSTOOLS.BSON2JSON / JSON2BSON
Permettant de stocker du JSON au format binaire
Il peut aussi être stocké en clair dans du VARCHAR
JSON_TABLE(
JSON_SOURCE
JSON_PATH
COLUMNS nom type PATH 'json_path', ... ) as X
$ | objet en cours |
. | élément dans l'objet en cours |
[ ] | élément dans un tableau |
un_nom | la valeur de l'élément |
{ "id" : 901, "name" : { "first":"John", "last":"Doe" }, "phones" : [{"type":"home", "number":"555-3762"}, {"type":"work", "number":"555-7252"}] }' |
COLUMNS( id VARCHAR(10) PATH 'lax $.id', first VARCHAR(10) PATH 'lax $.name.first', last VARCHAR(10) PATH 'lax $.name.last' ) |
->ne recevoir que la(les) première(s) valeur(s)
Ecrivez
SELECT X.nom ,x.rue, x.ville, x.TEL
FROM posample/Customer,
XMLTABLE (
XMLNAMESPACES(DEFAULT 'http://posample.org'),
'$c/customerinfo' passing INFO as "c"
COLUMNS
NOM CHAR(30) PATH 'name',
RUE VARCHAR(25) PATH 'addr/street',
VILLE VARCHAR(25) PATH 'addr/city',
TEL char(10) PATH 'phone[1]'
) AS X
SELECT X.nom ,x.rue, x.ville, x.TELNESTED avec JSON_TABLE
FROM posample.Customer,
XMLTABLE (
XMLNAMESPACES(DEFAULT 'http://posample.org'),
'$c/customerinfo/phone' passing INFO as "c"
COLUMNS
NOM CHAR(30) PATH '../name',
RUE VARCHAR(25) PATH '../addr/street',
VILLE VARCHAR(25) PATH '../addr/city',
TEL char(20) PATH '.'
) AS X
SELECT X.nom ,x.rue, x.ville, x.TEL, X.NUMERO
FROM posample.Customer,
XMLTABLE (
XMLNAMESPACES(DEFAULT 'http://posample.org'),
'$c/customerinfo/phone' passing INFO as "c"
COLUMNS
NOM CHAR(30) PATH '../name',
RUE VARCHAR(25) PATH '../addr/street',
VILLE VARCHAR(25) PATH '../addr/city',
TEL char(20) PATH '.',
NUMERO FOR ORDINALITY
) AS X
SELECT X.nom ,x.rue, x.ville, x.TEL
FROM posample/Customer,
XMLTABLE (
XMLNAMESPACES(DEFAULT 'http://posample.org'),
'$c/customerinfo' passing INFO as "c"
COLUMNS
NOM CHAR(30) PATH 'name',
RUE VARCHAR(25) PATH 'addr/street',
VILLE VARCHAR(25) PATH 'addr/city',
TEL XML PATH 'phone'
) AS X
Enfin les Technology Refresh apportent de nouvelles fonctions pour lire du JSON
TR2
Deux nouveaux Prédicats (un test, retournant vrai ou faux, pouvant être placé dans un WHERE)
IS (IS NOT) JSON
![]()
Exemple d'utilisation
![]()
JSON_EXISTS (un élément JSON existe-t-il ?)
TR3
VALUES(JSON_ARRAY((SELECT DEPTNO FROM DEPT SELECT JSON_OBJECT('Nom' : LASTNAME, SELECT workdept, JSON_ARRAYAGG(lastname)
SELECT JSON_OBJECTAGG(workdept, JSON_OBJECTAGG(char(empno) value lastname)
options ------- •ABSENT on NULL (dft) •NULL on NULL •FORMAT JSON | BSON Indique que la data est déjà formatée : évite dans le cas de SELECT imbriqués (clause WITH) -les caractères d'échappement \ devant { et [ -les " autours des mots true et false •Order BY .... tri la donnée lors de l'agrégation •RETURNING CLOB(2G) CCSID 1208 (dft) •RETURNING CHAR/VARCHAR...ENCODING UTF-8 | UTF16 •RETURNING CHAR/VARCHAR...CCSID xxx •RETURNING BLOB •WITH UNIQUE KEYS (SQLCODE -16400/SQLSTATE 22030 en cas de clé en double dans le JSON) •WITHOUT UNIQUE KEYS (clé en double admises, depuis SF99702/level 23,SF99703/level 11) |
Copyright © 2018 VOLUBIS