![]() |
Comelio GmbH
|
Comelio-Blog > MS SQL Server > Datentypmethoden für XML-Bearbeitung Datentypmethoden für XML-Bearbeitung
Verarbeiten und abfragen mit DatentypmethodenFü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:
Abfragen ausführenDie 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,
'
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.
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. Datenänderungen ausführenAuch 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.
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.
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.
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.
Seminare
|
||