Dieser Abschnitt beschreibt XML und zugehörige Funktionalitäten in MySQL.
Beachten Sie, dass es möglich ist, in den MySQL-Clients
mysql und mysqldump eine
XML-formatierte Ausgabe zu erhalten, indem man sie mit der Option
--xml
aufruft. Siehe auch
Abschnitt 8.5, „mysql — Das MySQL-Befehlszeilenwerkzeug mysql“, und Abschnitt 8.10, „mysqldump — Programm zur Datensicherung“.
Seit Version 5.1.5 enthält MySQL zwei Funktionen, die grundlegende XPath-Funktionalitäten (XML Path Language) bereitstellen.
Beachten Sie, dass sich diese Funktionen derzeit noch in Entwicklung befinden. Wir werden diese und andere Aspekte von XML und XPath in MySQL 5.1 und höher kontinuierlich verbessern. Sie können diese Funktionen im MySQL XML User Forum diskutieren, Fragen stellen und entsprechende Hilfe von anderen Benutzern erhalten.
ExtractValue(
xml_frag
,
xpath_expr
)
Diese Funktion nimmt zwei String-Argumente – ein
XML-Fragment xml_frag
und einen
XPath-Ausdruck xpath_expr
(auch
Lokator genannt) – entgegen und gibt
den xpath_expr
entsprechenden Wert
zurück. Beachten Sie, dass ExtractValue()
nur das CDATA
zurückgibt, das direkt im
xpath_expr
entsprechenden Tag
enthalten ist, nicht jedoch Tags, die innerhalb des
entsprechenden Tags enthalten sind, oder deren Inhalte (siehe
auch das als val1
im folgenden Beispiel
zurückgegebene Ergebnis).
Wird keine Übereinstimmung für
xpath_expr
gefunden, dann gibt die
Funktion einen Leer-String zurück.
Werden mehrere Übereinstimmungen gefunden, dann werden die
Inhalte aller entsprechenden Elemente (in der Reihenfolge der
Übereinstimmung) in einem leerzeichengetrennten String
zurückgegeben.
mysql>SELECT
->ExtractValue('<a>ccc<b>ddd</b></a>', '/a') AS val1,
->ExtractValue('<a>ccc<b>ddd</b></a>', '/a/b') AS val2,
->ExtractValue('<a>ccc<b>ddd</b></a>', '//b') AS val3,
->ExtractValue('<a>ccc<b>ddd</b></a>', '/b') AS val4,
->ExtractValue('<a>ccc<b>ddd</b><b>eee</b></a>', '//b') AS val5;
+------+------+------+------+---------+ | val1 | val2 | val3 | val4 | val5 | +------+------+------+------+---------+ | ccc | ddd | ddd | | ddd eee | +------+------+------+------+---------+
UpdateXML(
xml_target
,
xpath_expr
,
new_xml
)
Diese Funktion ersetzt einen Teil eines gegebenen
XML-Fragments xml_target
durch ein
neues XML-Fragment new_xml
und gibt
das geänderte XML dann zurück. Der Teil von
xml_target
, der ersetzt wird,
entspricht einem XPath-Ausdruck
xpath_expr
, der vom Benutzer
übergeben wurde. Wird kein Ausdruck entdeckt, der
xpath_expr
entspricht, dann gibt
die Funktion das ursprüngliche XML-Fragment
xml_target
zurück. Alle drei
Argumente müssen Strings sein.
mysql>SELECT
->UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,
->UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,
->UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,
->UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4
->\G
*************************** 1. row *************************** val1: <e>fff</e> val2: <a><b>ccc</b><d></d></a> val3: <a><e>fff</e><d></d></a> val4: <a><b>ccc</b><e>fff</e></a>
Es folgen nun Beschreibungen und Beispiele einiger einfacher XPath-Ausdrücke:
/
tag
Entspricht
<
,
wenn (und nur wenn)
tag
/><
das
Stammelement ist.
tag
/>
Beispiel: /a
findet eine Übereinstimmung
in <a><b/></a>
, weil es
dem äußersten Tag (Stamm-Tag) entspricht. Es entspricht
nicht dem inneren a
-Element in
<b><a/></b>
, weil es in
dieser Instanz ein einem anderen Element untergeordnetes
Element ist.
/
tag1
/tag2
Entspricht
<
,
wenn (und nur wenn) es ein untergeordnetes Element von
tag2
/><
und
tag1
/><
das Stammelement ist.
tag1
/>
Beispiel: /a/b
entspricht dem Element
b
im XML-Fragment
<a><b/></a>
, weil es ein
untergeordnetes Element des Stammelements
a
ist. Keine Entsprechung liegt in
<b><a/></b>
vor, weil in
diesem Fall b
das Stammelement (und
damit kein einem anderen Element untergeordnetes Element) ist.
Ebenso wenig hat der XPath-Ausdruck eine Übereinstimmung in
<a><c><b/></c></a>
;
hier stammt b
zwar von
a
ab, ist aber im engen Sinne kein
a
untergeordnetes Element.
Dieses Konstrukt ist auf drei oder mehr Elemente erweiterbar.
So entspricht beispielsweise der XPath-Ausdruck
/a/b/c
dem Element
c
im Fragment
<a><b><c/></b></a>
.
//
tag
Entspricht jeder Instanz von tag
.
Beispiel: //a
entspricht dem Element
a
in allen folgenden Fragmenten:
<a><b><c/></b></a>
;
<c><a><b/></a></b>
;
<c><b><a/></b></c>
.
//
kann mit /
kombiniert
werden. Beispielsweise entspricht //a/b
dem
Element b
in den Fragmenten
<a><b/></a>
und
<a><b><c/></b></a>
.
Der Operator *
agiert als Jokerzeichen,
welches jedem Element entspricht. So entspricht beispielsweise
der Ausdruck /*/b
dem Element
b
in den XML-Fragmenten
<a><b/></a>
und
<c><b/></c>
. Allerdings
erzeugt der Ausdruck keine Übereinstimmung im Fragment
<b><a/></b>
, weil
b
ein einem anderen Element
untergeordnetes Element sein muss. Das Jokerzeichen kann an
beliebiger Position verwendet werden: Der Ausdruck
/*/b/*
entspricht jedem untergeordneten
Element eines Elements b
, welches
selbst nicht das Stammelement ist.
Mehrere Lokatoren können mit dem Operator
|
(logisches OR
)
verglichen werden. So entspricht etwa der Ausdruck
//b|//c
allen b
-
und c
-Elementen im XML-Ziel.
Es ist auch möglich, ein Element basierend auf dem Wert eines
oder mehrerer seiner Attribute zu vergleichen. Dies erfolgt
mit der Syntax
.
So entspricht beispielsweise der Ausdruck
tag
[@attribute
="value
"]//b[@id="idB"]
dem zweiten Element
b
im Fragment
<a><b id="idA"/><c/><b
id="idB"/></a>
. Um einen Vergleich mit
einem beliebigen Element mit
durchzuführen, benutzen Sie den XPath-Ausdruck
attribute
="value
"//*[
.
attribute
="value
"]
Um mehrere Attributwerte zu filtern, benutzen Sie einfach
mehrere aufeinander folgende Attributvergleichsklauseln. Der
Ausdruck //b[@c="x"][@d="y"]
beispielsweise
entspricht dem Element <b c="x"
d="y"/>
an beliebiger Stelle in einem gegebenen
XML-Fragment.
Um Elemente zu finden, für die dasselbe Attribut genau einem
von mehreren Werten entspricht, müssen Sie mehrere Lokatoren
benutzen, die mit dem Operator |
verknüpft
werden. Um also etwa eine Übereinstimmung für alle Elemente
b
zu erzielen, deren Attribute
c
entweder den Wert 17 oder den
Wert 23 haben, verwenden Sie den Ausdruck
//b[@c="23"]|b[@c="17"]
.
Eine detaillierte Beschreibung zu Syntax und Einsatz von XPath würde den Rahmen dieses Handbuchs sprengen. Umfassende Informationen erhalten Sie unter XML Path Language (XPath) 1.0 standard. Eine nützliche Ressource für Neulinge im Bereich XPath oder für solche Leser, die ihre Kenntnisse ein wenig auffrischen wollen, ist das Zvon.org XPath Tutorial, das in mehreren Sprachen verfügbar ist.
Die von diesen Funktionen unterstützte XPath-Syntax unterliegt derzeit den folgenden Beschränkungen:
Nodeset-Nodeset-Vergleiche (wie etwa
'/a/b[@c=@d]'
) werden nicht unterstützt.
Nur Vergleiche der Form
[@
,
wobei attribute
="const
"]const
ein konstanter Wert
ist, sind zurzeit möglich. Beachten Sie, dass Gleichheit und
Ungleichheit (=
und !=
)
die einzigen unterstützten Vergleichsoperatoren sind.
Relative Lokatorausdrücke werden nicht unterstützt.
XPath-Ausdrücke müssen mit /
oder
//
beginnen.
Der Operator ::
wird nicht unterstützt.
Die folgenden XPath-Funktionen werden nicht unterstützt:
id()
lang()
last()
local-name()
name()
namespace-uri()
normalize-space()
starts-with()
string()
substring-after()
substring-before()
translate()
Die folgenden Axes werden nicht unterstützt:
following-sibling
following
preceding-sibling
preceding
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.