25. november 2002 - 17:22
Der er
14 kommentarer og 1 løsning
SAXParse
Mangler en stump kode hvor man fra en .XML (hvori der er erklæret SQL statements) for fat i disse og execute dem?
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
25. november 2002 - 18:03
#1
For SAX delen måske noget i retning af: <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <statements> <statement SQL="SELECT * FROM T1"/> <statement SQL="SELECT * FROM T2"/> </statements> import org.xml.sax.*; import org.xml.sax.helpers.*; public class MySax extends DefaultHandler { public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException { for(int i = 0; i < atts.getLength(); i++) { System.out.println("executing: " + atts.getValue(i)); } return; } } import javax.xml.parsers.*; import org.xml.sax.*; public class SaxSql { public static void main(String[] args) throws Exception { SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setValidating(false); SAXParser saxParser = spf.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(new MySax()); xmlReader.parse("file:SaxSql.xml"); return; } }
25. november 2002 - 18:04
#2
Hvis I kigger lidt i de sidste ugers svar vil I finde masser af database/SQL/JDBC eksempler !
25. november 2002 - 18:59
#3
Jeg tænker med connection og statement skal de executes mod db'en!
25. november 2002 - 19:08
#4
Ja.
Se f.eks.:
http://www.eksperten.dk/spm/287482 I putter så executeUpdate ind i jeres SAX handler.
(jeg tror ikke at executeQuery passer ind i SAX
sammenhæng)
25. november 2002 - 19:25
#5
Det ville hjælpe gevaldigt hvis du viste os et eksempel på hvordan en sådan xml fil kunne se ud, der er stor forskel på hvordan du behandler det hvis der står statements direkte, i modsætning til en form for xml kodning som i: <select selection="*"> <from>tabelnavn</from> <where>navn<like>'%sen'</like></where> </select> eller hvad ved jeg. I så fald skal handleren være noget mere detaljeret end i eksemplet ovenfor.
25. november 2002 - 19:48
#6
Jeg er en smule ny i xml .... <statements> <create> <statement SQL = "Create Table test (name (2))/> </create> </statements> noget i den stil
25. november 2002 - 19:49
#7
arne_v: nu vi er i det hjørne hvor ingen overflødig beregning skal laves så skal: for(int i = 0; i < atts.getLength(); i++) altid være for(int i = 0, n = atts.getLength(); i < n; i++) :)
25. november 2002 - 19:51
#8
jamen så skal du have en lidt udvidet version af arne_v's kode, den skal du nok få snart.
25. november 2002 - 20:23
#9
Måske noget i retning af: <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <statements> <create> <statement SQL="CREATE TABLE T1"/> <statement SQL="CREATE TABLE T2"/> </create> <insert> <statement SQL="INSERT INTO T1"/> <statement SQL="INSERT INTO T2"/> </insert> </statements> import org.xml.sax.*; import org.xml.sax.helpers.*; public class MySax extends DefaultHandler { private final static int CREATE = 1; private final static int INSERT = 2; private int mode = 0; public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException { if(rawName.equals("create")) mode = CREATE; if(rawName.equals("insert")) mode = INSERT; for(int i = 0; i < atts.getLength(); i++) { switch(mode) { case CREATE: System.out.println("create statement: " + atts.getValue(i)); break; case INSERT: System.out.println("insert statement: " + atts.getValue(i)); break; default: break; } } return; } }
25. november 2002 - 20:26
#10
To noter: * at SQL kommandoen både er i tag navn og attribut value er redundant * min SAX parser er ikke særligt køn
25. november 2002 - 20:32
#11
carsten: din konstruktion er ikke særligt køn og er faktisk langsommere i de tilfælde hvor det gennemsnitlige antal attributter per tag er tæt på 0. Så jeg køber den ikke.
25. november 2002 - 20:36
#12
arne_v: du behøver ikke at købe den; den er bedre selv om du ikke køber den. Den er også en generel måde at beregne en invariant på, der iøvrigt har så lokalt scope som muligt. PS jeg synes ikke (jeg gentager: ikke) at man skal lave den hurtigste løsning for enhver pris, vedligeholdelse og læsbarhed er helt centrale. Hvis kun hastighed betød noget kodede vi ikke Java:)
25. november 2002 - 20:44
#13
Følgende er lidt kønnere: import org.xml.sax.helpers.*; public class MySax extends DefaultHandler { private final static int CREATE = 1; private final static int INSERT = 2; private int mode = 0; public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException { if(rawName.equals("create")) mode = CREATE; if(rawName.equals("insert")) mode = INSERT; int sqlix = atts.getIndex("SQL"); if(sqlix >= 0) { switch(mode) { case CREATE: System.out.println("create statement: " + atts.getValue(sqlix)); break; case INSERT: System.out.println("insert statement: " + atts.getValue(sqlix)); break; default: break; } } return; } }
25. november 2002 - 21:34
#14
Jeg mangler bare det jeg spurgte om i starten med execution af disse SQL string inde i Java. I form af Statement
25. november 2002 - 21:46
#15
Jeg takker! Du får velfortjent dine 60 points!
Kurser inden for grundlæggende programmering