Beratung Veröffentlichungen Beratung Programmierung Server Seminare Lösungen Unternehmen Kontakt Start
 

Comelio-Blog > MS SQL Server > Datentypmethoden für XML-Bearbeitung

Datentypmethoden für XML-Bearbeitung

Nachdem man schon gespeicherte XML-Daten aus der Datenbank oder dem Dateisystem abgerufen oder auf Basis einer Abfrage zusammengesetzt hat, stellt sich die Frage, wie man diese verarbeiten kann. Dazu bietet sich zunächst die Möglichkeit an, sie wieder in relationale Darstellungen zurückzuwandeln, wie dies über OPENXML geschieht. Als weitere Alternative stehen eine Reihe von Methoden zur Verfügung, die (wie in Oracle übrigens) direkt mit dem Datentyp xml verknüpft sind. Sie lassen sich über eine objektorientierte Punktnotation aufrufen und dienen hauptsächlich dazu, XML-Daten weiter abzufragen und sie für eine weitere Verarbeitung zu untersuchen oder zu filtern.

Kontakt

Anrede* Herr Frau
Vorname*
Nachname*
Firma
E-Mail*
Tel-Nr.
Bereich*
Freitext

Verarbeiten und abfragen mit Datentypmethoden

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:

  • query() erlaubt es, XML-Daten mit Hilfe von XQuery abzufragen. Syntax: query ('XQuery')
  • value() erlaubt es, einen Wert aus XML in einem bestimmten SQL-Datentyp abzurufen. Syntax: value (XQuery, SQLType)
  • exist() erlaubt es, zu überprüfen, ob eine Abfrage ein nicht leeres Ergebnis liefert. Syntax: exist (XQuery)
  • modify() erlaubt es, Änderungen an XML-Daten auszuführen (XML DML). Syntax: modify (XML_DML)
  • nodes() erlaubt es, XML in Teilen abzurufen, die in einzelnen Schritten bearbeitet oder in relationale Strukturen übertragen werden sollen. Syntax: nodes (XQuery) as Table(Column)

Abfragen ausführen

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,
         ''
         + CAST(@resultXML AS nvarchar(max))
         + '') 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.

Datenänderungen ausführen

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 GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -Comelio GmbH MS SQL Server: Datentypmethoden für XML-Bearbeitung - MS SQL Server T-SQL XML Webservices Programmierung Bücher Anleitung Tutorial Skulschus Wiederstein Kozik Server Microsoft XML SQL T-SQL Reporting Services .NET Analysis Bücher Webservices Intelligence Business MS -