|
|
Datenbankergebnis als XML

|
| von antonrechenauer, 08.07.2004 11:31:26 |
[vote] |
kleines Beispiel, wie man ein Resultset in eine XML-Datei verwandeln kann
Achtung: Viele RDBMS bieten dafür schon eigene SELECT Statements, daher ist das möglicherweise überflüssig!
|
package de.antonrechenauer.sql2xml;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.XMLFilterImpl;
public class ResultSetToXml
{
private static final String VALUE_ATTRIBUTE = "value";
private static final String NAME_ATTRIBUTE = "name";
private static final String ROOTELEMENT = "resultset";
private static final String COLUMNELEMENT = "property";
private static final String ROWELEMENT = "record";
/**
* Sehr einfache Klasse, die aus einer Datenbankverbindung
* und einem SQL-Abfragestring ein ebenfalls sehr einfaches
* XML Dokument erzeugt
*
* Besser als out.print("<foo>"), weil Sonderzeichen < > &
* automatisch konvertiert werden!
*
* TODO: Exceptions werden einfach weitergeworfen!
* TODO: Unterstützung für Namespaces
* TODO: Verwendet immer rs.getString()
* TODO: Spaltennamen nicht immer wieder ausgeben (Kopfzeile?)
* TODO: Parameterliste zu lang, refactoring nötig
* TODO: usw.
*/
public static void run(OutputStream out, String encoding, Connection conn, String sqlquery)
throws Exception
{
final ResultSet rs = conn.createStatement().executeQuery(sqlquery);
//
// anonyme innere Klasse, die die abstrakte Basisklasse XMLFilterImpl erweitert
// parse-Methode wird unten durch Transformer.transform angestossen!
//
XMLFilter xmlgenerator = new XMLFilterImpl()
{
public void parse(InputSource ignore) throws SAXException, IOException
{
startDocument();
startElement("",ROOTELEMENT,ROOTELEMENT,null);
try
{
int columncount = rs.getMetaData().getColumnCount();
String[] columnnames = new String[columncount];
for(int i=1;i<=columncount;i++)
{
columnnames[i-1]=rs.getMetaData().getColumnLabel(i);
}
while(rs.next())
{
startElement("",ROWELEMENT,ROWELEMENT,null);
for(int i=1;i<=columncount;i++)
{
AttributesImpl attr = new AttributesImpl();
attr.addAttribute("",NAME_ATTRIBUTE,NAME_ATTRIBUTE,"",columnnames[i-1]);
String value = rs.getString(1);
attr.addAttribute("",VALUE_ATTRIBUTE,VALUE_ATTRIBUTE,"",(null!=value?value:""));
startElement("",COLUMNELEMENT,COLUMNELEMENT,attr);
endElement("",COLUMNELEMENT,COLUMNELEMENT);
}
endElement("",ROWELEMENT,ROWELEMENT);
}
rs.close(); // schliessen...
}
catch (SQLException e)
{
// kann geworfene Exception nicht ändern wg. API
// machen wir also eine SAXException daraus!
throw new SAXException(e);
}
endElement("",ROOTELEMENT,ROOTELEMENT);
endDocument();
}
};
StreamResult outputTarget = new StreamResult(out);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,"no"); // "yes" machts langsamer...
transformer.setOutputProperty(OutputKeys.METHOD,"xml");
transformer.setOutputProperty(OutputKeys.STANDALONE,"yes");
transformer.setOutputProperty(OutputKeys.ENCODING,encoding);
transformer.transform(new SAXSource(xmlgenerator,new InputSource()),outputTarget);
}
}
|
|
|
Hinweis: Auf dieser Seite liegen Links zu anderen Seiten im Internet. Für alle diese Links gilt: Wir
betonen ausdrücklich, daß wir keinerlei Einfluß auf die Gestaltung und die Inhalte der gelinkten Seiten
haben. Deshalb distanzieren wir uns hiermit ausdrücklich von allen Inhalten aller gelinkten Seiten auf
dieser Homepage und machen uns ihre Inhalte nicht zueigen. Diese Erklärung gilt für alle auf unserer
Homepage angebrachten Links
Redaktion/Betreiber von JSP-Develop übernehmen keinerlei Gewährleistung und Verantwortung für die Richtig-
und/oder Vollständigkeit von den auf den Webseiten JSP-Develop veröffentlichten Source Codes.
Die Verantwortung der Verwendung/Anwendung sowie etwaige Modifikation der hier veröffentlichten Sourcen
obliegt einzig dem Benutzer der Webseite, welche die veröffentlichten Sourcen in einer Applikation/Anwendung
einsetzt. Durch das Kopieren und/oder Benutzen der Sourcen in einer Applikation/Anwendung
bzw. etwaigen Abschriften wird dieser Rechtshinweis anerkannt.
Java, JSP, JavaServer Pages, J2EE, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and in other countries.
IBM, WebSphere are trademarks or registered trademarks of International Business Machines Corporation.
Other trademarks and registered trademarks are the property of their respective owners.
|
|
|
|