Für die Verarbeitung benutzt man im Wesentlichen XPath oder XQuery, zwei
Abfragemöglichkeiten für XML-Daten, die auch in solchen Techniken
wie XSLT (eXtensible Stylesheet Language for Transformations, XML-basierte
Skriptsprache zur XML-Umwandlung in XML/HTML oder Text), Datenbanken wie MS
SQL Server oder Oracle sowie verschiedenen Programmiersprachen oder integrierten
Techniken wie DOM (Document Object Model, standardisierte Klassen- und Methodensammlung
zur XML-Verarbeitung in diversen Programmiersprachen) genutzt werden. Beide
Techniken sind durchaus sehr umfangreich, können allerdings sinnvoll nicht
in vollem Umfang in T-SQL genutzt werden, obwohl dies syntaktisch durchaus
möglich ist. Sie werden in den nachfolgenden Abschnitten soweit dargestellt,
dass ein T-SQL-Programmierer die Methoden überhaupt nutzen kann.
Die folgende Liste stellt zunächst die verschiedenen Methoden dar:
Die Methode query() erwartet einen XPath- oder einen XQuery-Ausdruck, wobei
in den nachfolgenden Beispielen zunächst XPath aufgrund der Kürze
zum Einsatz kommt. Dabei ist die Methode an sich weniger wichtig für die
Ausführung einer Abfrage als ein korrekter und sinnvoller XPath-Ausdruck,
denn die Methode an sich erwartet nur eine Zeichenkette als Parameter. Diese
Zeichenkette jedoch muss sich zu einer sinnvollen Anweisung der genannten Techniken
auflösen, welche durchaus umfangreich sein kann.
Das nachfolgende Beispiel erstellt aus einer Abfrage, welche die Produkte mit schwarzer Farbe abruft, eine neue XML-Datei aus vor- und nachgeschalteten Wurzelelement-Tags. Diese XML-Struktur prüft man mit exist() ab, ob nun auch Produkte mit Farbe Orange enthalten sind, was allerdings (ganz überraschend) nicht der Fall ist.
SET @resultXML = @productXML.query('//Product[Details/Color =
"Black"]')
SELECT CONVERT(xml,
'<Product-List>'
+ CAST(@resultXML AS nvarchar(max))
+ '</Product-List>') AS XML
-- Existenzprüfung
DECLARE @exist int
SET @exist = @productXML.exist('//Product[Details/Color =
"Orange"]')
IF @exist = 0 BEGIN
PRINT 'Keine Produkte in Orange' + STR(@exist)
END
Als Ergebnis erhält man eine Liste von Product-Elementen in der gefilterten Farbe in einem umfassenden Product-List-Element mit den enthaltenen Name-Elementen.
<Product-List>
<Product>
<Name>Road-750 Black, 52</Name>
</Product>
<Product>
<Name>Road-750 Black, 48</Name>
</Product>
</Product-List>
Im weiteren Verlauf des Kapitels folgen noch ausführliche Erläuterungen zu den beiden möglichen Techniken XPath und XQuery, ohne weclche diese Methode nicht benutzbar ist.
Auch Datenänderungen sind in einer xml-Spalte/-Variable möglich,
was mit einer Zeichenkette, in der die XML-Daten abgespeichert sind, nicht
möglich ist. Dazu steht die modify()-Methode bereit, welche Syntax in
der so genannten XML DML (Data Modification Language) erwartet. Es handelt sich
dabei um eine Erweiterung des XQuery-Standards mit den Schlüsselwörtern
insert für Einfügevorgänge, delete für Löschvorgänge
und replace value of für Ersetzungsvorgänge. Es gibt einige Einschränkungen,
die bei typisiertem und nicht typisiertem XML zu beachten sind. Typisiertes
XML ist XML, welches über XML Schema beschrieben und daher validiert werden
kann, wobei dies ein Thema im folgenden Kapitel ist. In beiden Fällen
können die Attribute xmlns, xmlns:* und xml:base nicht hinzugefügt,
geändert oder gelöscht werden. Typisiertes XML kann darüber
hinaus auch nicht xsi:nil und xsi:type mit den DML-Anweisungen bearbeitet werden.
Nicht typisiertes XML kann dagegen sehr wohl xsi:nil verwenden. Da typisiertes
XML von XML Schema abhängt, müssen die Änderungen sich unmittelbar
zu gültigem XML ergeben.
Die allgemeine Syntax für diese Bearbeitungsmöglichkeiten besteht neben den erwähnten zusätzlichen Schlüsselwörtern aus einigen weiteren Angaben, die insbesondere beim Einfügen aufgrund der Reihenfolgenproblematik (vorher, nachher etc. einfügen) notwendig sind. Als Ausdrücke werden immer XPath-Ausdrücke erwartet, welche Positionen angeben oder XML-Fragmente bzw. Textknoten enthalten.
-- Einfügen
insert Expression1 (
{as first | as last}
into | after | before
Expression2 )
-- Löschen
delete Expression
-- Ersetzen
replace value of Expression1 with Expression2
Im nachfolgenden Beispiel gibt es verschiedene Einfügevorgänge. Dabei ist immer zu beachten, welcher Inhalt (Knoten, Fragment, Text) an welche Stelle (Reihenfolge, Textknoten) eingefügt werden soll. Für die Adressierung verwendet man immer einen XPath-Filter, der auf eine Position prüft, um tatsächlich einen einzigen Ort zu adressieren, an dem die Inhalte eingefügt werden können.
-- Price-Element nach Name einfügen
SET @resultXML.modify(
'insert <Prices></Prices> as last
into (//Product)[1]')
-- Standard als erstes Kind in Prices einfügen
SET @resultXML.modify(
'insert <Standard>343.6496</Standard>
into (//Product/Prices)[1]')
-- List nach Standard einfügen
SET @resultXML.modify(
'insert <List>343.6496</List> after
(//Product/Prices/Standard)[1]')
-- Details nach Prices einfügen
SET @resultXML.modify(
'insert <Details></Details> after
(//Product/Prices)[1]')
-- Color in Details einfügen
SET @resultXML.modify(
'insert <Color>Black</Color>
into (//Product/Details)[1]')
-- Size vor Color einfügen
SET @resultXML.modify(
'insert <Size>52</Size> before
(//Product/Details/Color)[1]')
Im Gegensatz zum Einfügen verhält sich die Arbeit mit dem delete-Schlüsselwort wesentlich einfacher. Hier muss lediglich der zu löschende Bereich adressiert werden, wozu ein XPath-Ausdruck zum Einsatz kommt. Ansonsten ist nicht viel mehr zu tun, denn alles, was der XPath-Ausdruck bei einem einfachen Test desselben findet, wird vollständig gelöscht. Dies wirkt sich nicht nur auf einen einzelnen Knoten aus, sondern auch auf an verschiedenen Orten im Dokument gefundenen Knoten.
-- Element löschen
SET @resultXML.modify('
delete (//Product[1]/Details/Color)')
-- Teilbaum löschen
SET @resultXML.modify('
delete (//Product[1]/Prices)')
-- Textknoten löschen
SET @resultXML.modify('
delete (//Product[1]/Details/Size/text())')
Mit Hilfe der replace-Anweisung lassen sich nur einfache Werte ersetzen und keine Fragmente einfügen. Dies ist aber auch nicht weiter tragisch, da man in diesem Fall auch eine Kombination aus einem Lösch- und einem Ersetzungsvorgang verwenden kann. Daher ist das nachfolgende Beispiel im Vergleich zu den vorherigen besonders kurz, da aus einem schwarzen nur ein Produkt in Orange wird. Allerdings fällt dieser Trick spätestens beim Namen auf, den man nur mit der substring()-Funktion aus XPath bearbeiten könnte.
comelio.com


