Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques

configuration Apache, Zend et PHP , Web services
Répondre
Erwan_35
Messages : 13
Enregistré le : ven. 09 juin 2017, 07:47:18
Localisation : Rennes

Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques

Message par Erwan_35 »

Bonjour à tous,

je vous expose ma problématique :
Je tente de produire un flux xml à 4 niveaux hiérarchiques. J'utilise les fonctions sql XMLAGG dans différentes vues sql afin d'agréger mes données.
Cela fonctionne bien dans l'ensemble mais il y a une petite particularité (il faut bien pimenter les choses :lol: ) : au niveau 3 (niveau de facture), je dois regrouper toutes les lignes de facture (niveau 4) mais aussi un groupe d'éléments synthétisant les codes TVA de la facture. Comme on ne peut par xmlagg agréger que sur un seul champ, j'ai créé un champ caractère recevant mon niveau "TVA" sous forme de "xml" (que j'ai alimenté par une requête du type XMLSERIALIZE(XMLAGG ...).
Le souci, c'est que quand j'utilise ce champ pour produire mon niveau 3, tous les caractères "<" et ">" ont été remplacés par les caractères d'échappement du xml "&lt;" et "&gt;".
J'ai essayé de remplacer tous les "<" et ">" de mon champ par "&lt;" et "&gt;" avant production du xml du niveau 3 mais ce n'est pas mieux, je me retrouve avec de "&amp;" en plus (logique : le système a remplacé tous les "&" de mon champ alpha par le caractère d'échappement "&amp;" !!!).

Quelqu'un voit-il une solution ?
Question subsidiaire : les fonctions sql produisant les éléments xml ne respectent pas la casse du nom que j'ai précisé dans le paramètre "name". Exemple : xmlforest(trim(lifour) as "SupName" produit <supname> (les majuscules de début de mot ont disparues).
Erwan

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques

Message par nbonnet »

Bonjour,

XMLSERIALIZE produit une chaine de caractères depuis une expression XML => le résultat n'est donc plus interprété comme du XML (vrai type pour DB2).
Essayer sans XMLSERIALIZE.
Pouvez-vous nous fournir une requête (simplifiée si possible) ?
Nathanaël

Erwan_35
Messages : 13
Enregistré le : ven. 09 juin 2017, 07:47:18
Localisation : Rennes

Re: Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques

Message par Erwan_35 »

Bonjour,

j'ai utilisé XMLSERIALIZE car je dois alimenter un champ de type CHAR(10000). Je précise de nouveau que je dois agréger ce champ au niveau supérieur de mon ficier xml par une requête avec un GROUP BY.
Or on ne peut pas faire de group by sur un champ de type XML (définition que j'avais donnée à mon champ au début).

En ôtant le XMLSERIALIZE, lorsque la requête s'exécute dans mon programme, j'ai une erreur sql -303 "La variable W_XMLDATA n'est pas compatible ou la valeur est trop longue."
Le champ est défini comme ceci dans mon prog : dcl-s w_xmlData varchar(10000);

Voici la requête avec XMLSERIALIZE :

Code : Tout sélectionner

with T1 (clif, numfac, cdtval, txtval, totgoods, totTaxAmount, totInvoice)                      
            as (select clif, numfac, cdtval, txtval, :w_totGoods, :w_totTaxAmount, :w_totInvoice
                from wxmlfacivc where numfac = :numfac_sv                                       
                                    group by clif, numfac, cdtval, txtval                       
                                    order by clif, numfac, cdtval)                              
select xmlserialize(xmlagg(xmlelement(name "TaxTableLine", xmlforest(trim(cdtval) as "TTTaxCode",     
               TXTVAL as "TTTaxRate", totgoods as "TTTotalGoodsValue",                                
               totTaxAmount as "TTTotalTaxAmount", totInvoice as "TTTotalInvTotal") )) as char(10000))         
    INTO :w_xmldata                                                                             
    from t1 group by clif, numfac ;
Et celle sans :

Code : Tout sélectionner

with T1 (clif, numfac, cdtval, txtval, totgoods, totTaxAmount, totInvoice)                      
            as (select clif, numfac, cdtval, txtval, :w_totGoods, :w_totTaxAmount, :w_totInvoice
                from wxmlfacivc where numfac = :numfac_sv                                       
                                    group by clif, numfac, cdtval, txtval                       
                                    order by clif, numfac, cdtval)                              
select xmlagg(xmlelement(name "TaxTableLine", xmlforest(trim(cdtval) as "TTTaxCode",     
               TXTVAL as "TTTaxRate", totgoods as "TTTotalGoodsValue",                                
               totTaxAmount as "TTTotalTaxAmount", totInvoice as "TTTotalInvTotal") ))   
    INTO :w_xmldata                                                                             
    from t1 group by clif, numfac ;
Erwan

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: Problème de caractères d'échappement dans XML à plusieurs niveaux hiéarrchiques

Message par nbonnet »

XMLGROUP permet de constituer un flux XML en groupant sur certaines valeurs, ce serait plus approprié : https://www.ibm.com/docs/fr/i/7.4?topic ... s-xmlgroup
Difficile de faire un test sans la BD.
Nathanaël

Répondre