Lire XML avec SQL Server parent/enfant

Résolu/Fermé
alexmilano Messages postés 422 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 30 novembre 2017 - Modifié par alexmilano le 29/02/2016 à 17:43
alexmilano Messages postés 422 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 30 novembre 2017 - 3 mars 2016 à 15:24
Bonjour,

Bon fallait trouver un titre, ça regroupe mes soucis ...
Je dois lire du XML en SQL Server. Je vous donne mon exemple, vous allez comprendre.

Mon xml :


<polymenus>
<actions>
<params>
<actionparams>
<TITLE>Test 1</TITLE>
</actionparams>
</params>
<subactions>
<actions>
<params>
<actionparams>
<TITLE>Test 2</TITLE>
</actionparams>
</params>
<subactions>
<actions>
<params>
<actionparams>
<TITLE>Test 3</TITLE>
</actionparams>
</params>
</subactions>
</actions>
<actions>
<params>
<actionparams>
<TITLE>Test 2 Bis</TITLE>
</actionparams>
</params>
</actions>
</subactions>
</actions>
</polymenus>



Un menu : Test 1.
2 sous menu de ce menu Test 1 : Test 2 et Test 2 Bis.
1 sous-menu de Test 2 : Test 3.


Je veux comme résultat : Une ligne par action, soit :
. Test 1
. Test 1 - Test 2
. Test 1 - Test 2 Bis
. Test 1 - Test 2 - Test 3


Voilà, si vous avez des idées ou des pistes.

J'ai déjà réussi à ramener le premier niveau :

declare @x xml
SET @x = XML (Ce XML étant mon code présenté)

SELECT v.value('./TITLE[1]','nvarchar(100)')
FROM @x.nodes('polymenus/actions/params/actionparams') AS t(v)


Et donc ça me parait pas compliqué de ramener chaque niveau, par contre, de trouver les liaisons, d'afficher mon résultat voulu, je galère, et je n'ai point trouvé de réponses encore ...

Pour le deuxième niveau, suffit de rajouter subactions/actions :

declare @x xml
SET @x = XML (Ce XML étant mon code présenté)

SELECT v.value('./TITLE[1]','nvarchar(100)')
FROM @x.nodes('polymenus/actions/subactions/actions/params/actionparams') AS t(v)




Merci d'avance pour votre aide et/ou vos réflexions afin de m'orienter !!






Si problème tu as, alors solution il y a ...
A voir également:

1 réponse

alexmilano Messages postés 422 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 30 novembre 2017 27
3 mars 2016 à 15:24
Pour information, j'ai trouvé. Au cas où quelqu'un en ait besoin un jour ...

DECLARE @X XML
SET @X = '
<polymenus>
<actions>
<params>
<actionparams>
<TITLE>Test 1</TITLE>
</actionparams>
</params>
<subactions>
<actions>
<params>
<actionparams>
<TITLE>Test 2</TITLE>
</actionparams>
</params>
<subactions>
<actions>
<params>
<actionparams>
<TITLE>Test 3</TITLE>
</actionparams>
</params>
</subactions>
</actions>
<actions>
<params>
<actionparams>
<TITLE>Test 2 Bis</TITLE>
</actionparams>
</params>
</actions>
</subactions>
</actions>
</polymenus>'



SELECT D1.value('(params/actionparams/TITLE)[1]', 'varchar(100)') Actions
FROM (SELECT @X X) X
CROSS APPLY X.nodes('//actions') AS N1(D1)

UNION

SELECT
D1.value('(params/actionparams/TITLE)[1]', 'varchar(100)') +
CASE WHEN D2.value('(params/actionparams/TITLE)[1]', 'varchar(100)') IS NULL THEN '' ELSE ' - ' + D2.value('(params/actionparams/TITLE)[1]', 'varchar(100)') +
CASE WHEN D3.value('(params/actionparams/TITLE)[1]', 'nvarchar(100)') IS NULL THEN '' ELSE ' - ' + D3.value('(params/actionparams/TITLE)[1]', 'nvarchar(100)')
END
END Actions

FROM (SELECT @X X) X
CROSS APPLY X.nodes('//actions') AS N1(D1)
OUTER APPLY D1.nodes('subactions/actions') AS N2(D2)
OUTER APPLY D2.nodes('subactions/actions') as N3(D3)
ORDER BY Actions



0