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( "&", "&amp;"); nodeValue = nodeValue.replaceAll( "<", "&lt;"); nodeValue = nodeValue.replaceAll( ">", "&gt;"); } 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