Lire XML avec SQL Server parent/enfant

Résolu
alexmilano Messages postés 423 Date d'inscription   Statut Membre Dernière intervention   -  
alexmilano Messages postés 423 Date d'inscription   Statut Membre Dernière intervention   -
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 423 Date d'inscription   Statut Membre Dernière intervention   27
 
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