Benutzer mit den meisten Antworten
Abfrage einer XML-Variable

Frage
-
Hallo,
ich schlage mich derzeit mit einer Abfrage einer XML-Variablen herum, die ich einfach nicht lösen kann. Ich kenne mich leider mit XQuery oder XPath kaum aus, deswegen probiere ich an Snippets aus dem Netz herum, ohne großen Erfolg.
Ich habe ein XML-Dokument in dieser Form in einer XML-Variablen gespeichert:
<dictionaries> <dict id="1"> <entry key="abc" value="11" /> <entry key="def" value="22" /> <entry key="ghi" value="33" /> </dict> <dict id="2"> <entry key="jkl" value="44" /> <entry key="mno" value="55" /> <entry key="pqr" value="66" /> </dict> </dictionaries>
Was mir gelungen ist bisher ist die Abfrage des Attributs id der Elemente dict. Sieht so aus:
select elem.item.value('(@id)[1]', 'int') as id from @dicts.nodes('//dictionaries/dict') as elem(item);
Nach demselben Prinzip habe ich auch die Attribute key und value der Elemente entry abgefragt:
select elem.item.value('@key[1]', 'varchar(10)') as [key] , elem.item.value('@value[1]', 'int') as [value] from @dicts.nodes('//dictionaries/dict/entry') as elem(item);
Wie führe ich aber nun die beiden Abfragen zusammen, sodass in diesem Fall folgendes Ergebnis zurückgeliefert werden würde:
+-----------------------+ | id | key | value | +-----------------------+ | 1 | abc | 11 | | 1 | def | 22 | | 1 | ghi | 33 | | 2 | jkl | 44 | | 2 | mno | 55 | | 2 | pqr | 66 | +-----------------------+
Wie geht man hier vor, um zu diesem Ergebnis zu kommen?
Danke für eure Hilfe :)
Antworten
-
Hallo Charles,
ganz einfach, mit ../ kannst Du in der Xml Hierachie eine Ebene nach "oben" navigieren und so kommst Du wieder an das Attribute dict dran, also
elem.item.value('../@id[1]', 'int')
Und Gesamt:
DECLARE @dicts xml;
SET @dicts =
'<dictionaries>
<dict id="1">
<entry key="abc" value="11" />
<entry key="def" value="22" />
<entry key="ghi" value="33" />
</dict>
<dict id="2">
<entry key="jkl" value="44" />
<entry key="mno" value="55" />
<entry key="pqr" value="66" />
</dict>
</dictionaries>';
select elem.item.value('../@id[1]', 'int') as id
,elem.item.value('(@key)[1]', 'varchar(3)') as [key]
,elem.item.value('(@value)[1]', 'int') as [value]
from @dicts.nodes('//dictionaries/dict/entry') as elem(item);
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Charles Auster Dienstag, 8. März 2011 12:24
Alle Antworten
-
Hallo Charles,
ganz einfach, mit ../ kannst Du in der Xml Hierachie eine Ebene nach "oben" navigieren und so kommst Du wieder an das Attribute dict dran, also
elem.item.value('../@id[1]', 'int')
Und Gesamt:
DECLARE @dicts xml;
SET @dicts =
'<dictionaries>
<dict id="1">
<entry key="abc" value="11" />
<entry key="def" value="22" />
<entry key="ghi" value="33" />
</dict>
<dict id="2">
<entry key="jkl" value="44" />
<entry key="mno" value="55" />
<entry key="pqr" value="66" />
</dict>
</dictionaries>';
select elem.item.value('../@id[1]', 'int') as id
,elem.item.value('(@key)[1]', 'varchar(3)') as [key]
,elem.item.value('(@value)[1]', 'int') as [value]
from @dicts.nodes('//dictionaries/dict/entry') as elem(item);
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Charles Auster Dienstag, 8. März 2011 12:24