Umsetzung von XPath nach SQL

Werbung
Umsetzungregeln XPath nach SQL
Umsetzung von XPath nach SQL
Technologie Memo
April 2005
 Dr. Arno Schmidhauser
Inhalt
1
2
3
4
Knotentabelle
Umsetzungsregeln
Beispiele
Umsetzungsprogramm
Technologie Memo
2
2
4
4
Arno Schmidhauser
1
Umsetzungregeln XPath nach SQL
1 Knotentabelle
Gegeben sei eine Knotentabelle mit einem Dietzschen
Nummerierungschema gemäss folgendem UML-Diagramm
«Table»
Node
«PK» idNode
«FK» idParentNode
nodeType
nodeName
nodeValue
beginSeqNr
endSeqNr
0..*
0..1
2 Umsetzungsregeln
Folgende Regeln kommen zur Anwendung, um XPath-Ausdrücke in
SQL-Abfragen zu übersetzen.
1. Die select-Klausel jeder Abfrage muss mindestens nodeType,
nodeName und nodeValue zurückgeben.
Æ select nodeType nt, nodeName nn, nodeValue nv
from ...
2. Die Ausgabesortierung ist in der Regel gegeben durch die
Reihenfolge der XML-Knoten im originalen Dokument. Diese
wiederum ist bestimmt durch beginSeqNr.
Æ order by beginSeqNr
3. Für jeden Lokalisierungsschritt in XPath muss die Node-Tabelle in
der from-Klausel einmal aufgeführt werden.
4. Für die Verbindung zweier Lokalisierungsschritte mit '/' in XPath
entsteht in SQL eine Verbundoperation zwischen zwei Instanzen
der Node-Tabelle.
Technologie Memo
Arno Schmidhauser
2
Umsetzungregeln XPath nach SQL
Æ from Node n1, Node n2
where n1.idNode = n2.idParentNode
5. Für die Verbindung zweier Lokalisierungsschritte mit '//' in XPath
entsteht in SQL eine Verbundoperation zwischen zwei Instanzen
der Node-Tabelle der Form:
Æ from Node n1, Node n2
where n1.beginSeqNr < n2.beginSeqNr
and n1.endSeqNr > n2.endSeqNr
6. Enthält ein Lokalisierungsschritt einen Elementnamen, zum
Beispiel .../book/... so ergibt sich in der where-Klausel
folgende Bedingung:
Æ where nodeType = 'element' and nodeName = 'book'
Für den Wildcard '*' entfällt die zweite Bedingung. Enthält der
Lokalisierungsschritt einen Attributnamen oder einen anderen
Knotentyp, so muss die Bedingung auf nodeType = 'attribute'
oder entsprechend des gewünschten Knotentyps gesetzt werden.
7. Enthält ein Lokalisierungsschritt eine XPath-Bedingung in eckigen
Klammern, kann diese in eine SQL-Unterabfrage umgesetzt
werden. Aus .../title[ .= 'Learning XML' ] ergibt sich
beispielsweise die SQL-Bedingung
Æ from Node n, ...
where n.nodeType = 'element' and n.nodeName = 'title'
and n.idNode in
( select idParent
from Node
where nodeType = 'text'
and nodeValue = 'Learning XML' )
8. Für den Zugriff auf das eigentliche Resultat einer XPath-Abfrage,
das heisst auf den gesamten XML-Teilbaum ab dem letzten
Lokalisierungsschritt n, wird folgender Ausdruck benötigt:
Æ select x.nodeType, x.nodeName, x.nodeValue
from …, Node n, Node x
where …
and n.beginSeqNr <= x.beginSeqNr
and n.endSeqNr >= x.endSeqNr
and n.nodeName = 'book' and n.nodeType = 'element'
order by x.beginSeqNr
x-Knoten stellen dabei die auszugebenden Knoten dar. Allfällige
Technologie Memo
Arno Schmidhauser
3
Umsetzungregeln XPath nach SQL
Bedingungen über n und die vorhergehenden Lokalisierungsschritte sind nicht aufgeführt.
3 Beispiele
1.
Der XPath-Ausdruck //book korrespondiert mit folgender SQLAbfrage:
select n2.nodeType, n2.nodeName, n2.nodeValue
from Node n1, Node n2
where n1.beginSeqNr <= n2.beginSeqNr
and n1.endSeqNr >= n2.endSeqNr
and n1.nodeName = 'book'
and n1.nodeType = 'element'
order by n2.beginSeqNr
2.
Der XPath-Ausdruck /catalog/book/title korrespondiert mit
folgender SQL-Abfrage:
select n4.nodeType nt, n4.nodeName nn, n4.nodeValue
nv
from Node n0, Node n1, Node n2, Node n3, Node n4
where n3.beginSeqNr <= n4.beginSeqNr
and
n3.endSeqNr >= n4.endSeqNr
and n3.nodeName = 'title'
and n3.nodeType = 'element'
and n3.idParentNode = n2.idNode
and n2.nodeName = 'book'
and n2.nodeType = 'element'
and n2.idParentNode = n1.idNode
and n1.nodeName = 'catalog'
and n1.nodeType = 'element'
and n1.idParentNode = n0.idNode
and n0.nodeName = '#document'
and n0.nodeType = 'document'
order by n4.beginSeqNr
4 Umsetzungsprogramm
Das Programm, welches die Umsetzung durchführt (siehe unten),
muss die Spalten aus der Select-Klausel in eine XML-formatierte
Zeichenkette unwandeln. Das Umsetzungsprogramm kann diese
Zeichenkette in einen DOM-Baum weiterverarbeiten.
Technologie Memo
Arno Schmidhauser
4
Umsetzungregeln XPath nach SQL
Der folgende Source Code wandelt die Ausgabe einer SQL-Abfrage
in eine korrekte XML-Darstellung um. Die SQL-Abfrage ist in der
Variable queryText enthalten. Die Variable out bezeichnet den
Ausgabestrom.
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery( queryText );
boolean elementPending = false;
while ( rs.next() ) {
String nodeType = rs.getString( "nt" );
String nodeName = rs.getString( "nn" );
String nodeValue = rs.getString( "nv" );
if ( nodeValue != null ) {
nodeValue = nodeValue.replaceAll( "&", "&");
nodeValue = nodeValue.replaceAll( "<", "<");
nodeValue = nodeValue.replaceAll( ">", ">");
}
else {
nodeValue = "";
}
if ( ! nodeType.equals( "attribute" )
&& elementPending ) {
out.print( ">" );
elementPending = false;
}
if ( nodeType.equals( "element" ) ) {
out.print( "<" + nodeName );
elementPending = true;
}
else if ( nodeType.equals( "end-element" ) ) {
out.print( "</" + nodeName + ">" );
}
else if ( nodeType.equals( "attribute" ) ) {
out.print( " " + nodeName + "='" + nodeValue + "'" );
}
else if ( nodeType.equals( "text" ) ) {
out.print( nodeValue );
}
else if ( nodeType.equals( "comment" ) ) {
out.print( "<!--" + nodeName + "-->" );
}
else if ( nodeType.equals( "processing-instruction" )){
out.print("<?" + nodeName + " " + nodeValue + "?>" );
}
else if ( nodeType.equals( "document" ) ) {
}
else {}
}
rs.close();
stmt.close();
Technologie Memo
Arno Schmidhauser
5
Herunterladen