ResultSet als XML Datei speichern

Emwykey

Mitglied
Hallo,
kann mir jemand erklären, wie ich aus einem ResultSet gewonnene Daten in eine XML Datei abspeichern kann? Momentan werden sie leider nur auf dem Bildschirm ausgegeben, hier mein code
Java:
package org.firebirdsql.jdbc;

import java.io.BufferedInputStream;



import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.rowset.RowSetProvider;
import javax.sql.rowset.WebRowSet;
import javax.sql.rowset.spi.XmlWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;



public class SQLDBAbfrage {

	public static void main(String args[]) throws Exception {

	
			
		Properties serverconnection = new Properties();
	
		try {
			serverconnection.load(new FileInputStream("config.properties"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		String treiber = serverconnection.getProperty("Driver");
		String datenbank = serverconnection.getProperty("Database");
		String username = serverconnection.getProperty("Username");
		String password = serverconnection.getProperty("Password");
		String name = serverconnection.getProperty("Databasename");
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.newDocument();
		Element results = doc.createElement("Results");
		doc.appendChild(results);

		Class.forName(treiber);
		Connection con = DriverManager.getConnection(datenbank,
				username, password);

		System.out.println("Enter SQL Code:");
		Statement stmt = con.createStatement();
		String sqlabfrage = new java.util.Scanner(System.in).nextLine();
		ResultSet rs = con.createStatement().executeQuery(sqlabfrage);

		ResultSetMetaData rsmd = rs.getMetaData();
		int colCount = rsmd.getColumnCount();

		while (rs.next()) {
			Element row = doc.createElement("Row");
			results.appendChild(row);
            
			for (int i = 1; i <= colCount; i++) {
				String columnName = rsmd.getColumnName(i);
				Object value = rs.getObject(i);
				Element node = doc.createElement(columnName);
				node.appendChild(doc.createTextNode(value.toString()));
				row.appendChild(node);
			}
		}
		DOMSource domSource = new DOMSource(doc);
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
		transformer.setOutputProperty(OutputKeys.METHOD, "xml");
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
		StringWriter sw = new StringWriter();	
		StreamResult sr = new StreamResult(sw);
		
		transformer.transform(domSource, sr);
		System.out.println(sw.toString());
		

        

		con.close();
		rs.close();
		}
        


	}

würde mich echt freuen, wenn mir jemand helfen kann.

Danke schonmal im vorraus

LG Emwykey
 
S

SlaterB

Gast
funktioniert es bei Zeile 98, kommt schon feriges XML an der Konsole an?
na das ist doch der größte Teil der Strecke,

jetzt nur noch den String in Datei schreiben mit BufferedWriter?
ein paar Probleme kann es da freilich auch geben,
aber wenn du extra UTF8 willst, dann sollte der Standard gut funktionieren, findet man überall

hier noch ein Link zu XMLOutputter und unten auch Beispiele zu BufferedWriter, ansonsten überall zu finden
http://www.java-forum.org/xml-co/141692-jdom-xmloutputter-getprettyformat.html
 

Emwykey

Mitglied
danke erstmal aber es funktioniert nicht ganz ... es wird zwar eine xml datei erstellt, jedoch ist diese wenn mehr als 2 spalten im select befehlt stehen leer und wenn eine spalte die etwas andres als zahlen erhält aufgerufen wird stehen einfach nur die spalteninhalten naheinander anneinandergereiht dort...

...
Java:
	public static void main(String args[]) throws Exception {

		DocumentBuilderFactory builderFactory = 
				   DocumentBuilderFactory.newInstance();
				   DocumentBuilder docBuilder = 
				   builderFactory.newDocumentBuilder();

				  Document doc = docBuilder.newDocument();
				  new ars().createXmlTree(doc);
	}
	public void createXmlTree(Document doc) throws Exception {
			
		Properties serverconnection = new Properties();
...
Java:
		transformer.transform(domSource, sr);
	
		File file = new File("newxml.xml");
  		BufferedWriter bw = new BufferedWriter
  		(new OutputStreamWriter(new FileOutputStream(file)));
  		bw.write(sw.toString());
  		bw.flush();
  		bw.close();
        

		con.close();
		rs.close();
		}






	}
ps classe wurde in ars umbenannt
 
S

SlaterB

Gast
nicht so planlos springen bitte, ging das denn vorher in der Konsole oder nicht?
zurück zur Variante mit
> System.out.println(sw.toString());

Hauptfrage: ist das immer das perfekte Ergebnis?
* wenn ja, dann schreibe an dieser Stelle in eine String-Variable,
die kann ja wohl kaum kaputt gehen, egal was du danach noch machst,
ist wirklich das Problem, dass der String korrekt ist, aber in der Datei merkwürdiges ankommt?

* wenn nein, dann ist der Rest mit Datei vorerst uninteressant,
dann muss geprüft werden, was vorher passiert,

das ResultSet wird durchlaufen, Row-Nodes angelegt usw., das sieht für mich von außen ganz normal richtig aus,
logge dort mit System.out.println(), wie oft die Schleife durchlaufen wird (in jedem Durchlauf eine Ausgabe),
wie viele Childs das Element results hat usw.,

jetzt fällt mir auf, dass du nirgendwo ein root-Element im Document setzt, setRootElement() vielleicht eher als appendChild() im Document?
na wie auch immer, logge auch nebenbei oder am Ende vor der Ausgabe wie der Baum aussieht, wieviel Childs hat
das erste Element usw.

falls du den Baum für in Ordnung hälst, kommt kein guter String raus?
das wäre übel

so, jetzt bin ich mal wieder so weit dass ich jede Menge erzähle, während du dir alles sparst, genau falsch rum ;)

hab sogar noch ein Beispielprogramm welches ohne die unnötige Last von ResultSet einen Beispiel-Baum baut,
klappt auch mit appendChild(), String zeigt zumindest was an,
inwiefern der String dann gespeichert wird überlasse ich nun hoffentlich erstmal dir,
arbeiten, schreiben, mitmachen ;)

Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();
        Element results = doc.createElement("Results");
        doc.appendChild(results);

        for (int j = 0; j < 4; j++)
        {
            Element row = doc.createElement("row" + j);
            results.appendChild(row);

            for (int i = 1; i <= 5; i++)
            {
                Element node = doc.createElement("col" + i);
                node.appendChild(doc.createTextNode("val" + i));
                row.appendChild(node);
            }
        }

        DOMSource domSource = new DOMSource(doc);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        StringWriter sw = new StringWriter();
        StreamResult sr = new StreamResult(sw);

        transformer.transform(domSource, sr);
        System.out.println(sw.toString());
    }

}
Ausgabe:
Code:
<Results><row0><col1>val1</col1><col2>val2</col2><col3>val3</col3><col4>val4</col4>
<col5>val5</col5></row0><row1><col1>val1</col1><col2>val2</col2><col3>val3</col3>
<col4>val4</col4><col5>val5</col5></row1><row2><col1>val1</col1><col2>val2</col2>
<col3>val3</col3><col4>val4</col4><col5>val5</col5></row2><row3><col1>val1</col1>
<col2>val2</col2><col3>val3</col3><col4>val4</col4><col5>val5</col5></row3></Results>

(alles in einer Zeile)
 

Emwykey

Mitglied
weiß aber nicht wie ich ihn beheben soll, und zwar wenn im Resultat der SQL-Abfrage ein Leerzeichen vorkommt also angenommen gesucht wären Name und der säche so aus: "Max Mustermann", wird das XML Dokument nicht richtig angezeigt. wenn ich jedoch im editor das Dokument von Hand umändre, sodass es zum Beispiel "Max_Mustermann" heißt bekomme ich eine wunderschöne XML Datei die im Namen eben den Untenstrich mit drinnen hat. Wie bekomme ich das hin ohne das Dokument von Hand nacharbeiten zu müssen???:L???:L???:L???:L
 
S

SlaterB

Gast
ich kann nur mein komplettes vorheriges Posting wiederholen,
wild Fehler aufzählen hilft ohne Beschreibung, ohne Code, ohne Vorgehen, ohne Plan wenig,
erst musst du irgendwas konkret machen, dann kann man das vielleicht untersuchen

wie geschon gesagt und jetzt ist es wirklich brutal von dir dass nicht drumherumkomme mich 1:1 zu wiederholen:
gehe zurück auf das erste Programm, auf die String-Ausgabe, was genau geht dort alles, welche Daten, welche nicht,
wieviele Ergebnisse mit welcher Ausgabe exakt usw.

und dann noch vieles andere was ich schon geschrieben habe
nur 'klick' und dein Programm läuft, so funktioniert es nicht (jedenfalls nicht in meiner Macht)
 

Emwykey

Mitglied
oke tut mir leid ich bin grad einfach fast am verzweifeln. also, das is mein momentaner code :
Java:
package org.firebirdsql.jdbc;

import java.io.BufferedWriter;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import java.sql.Statement;
import java.util.Properties;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class SQLQuery {
	
	
 


	public static void main(String args[]) throws Exception {

		DocumentBuilderFactory builderFactory = 
				   DocumentBuilderFactory.newInstance();
				   DocumentBuilder docBuilder = 
				   builderFactory.newDocumentBuilder();

				  Document doc = docBuilder.newDocument();
				  new SQLQuery().createXmlTree(doc);
	}
	public void createXmlTree(Document doc) throws Exception {
			
		Properties serverconnection = new Properties();    
	
		try {
			serverconnection.load(new FileInputStream("config.properties"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		String treiber = serverconnection.getProperty("Driver");
		String datenbank = serverconnection.getProperty("Database");
		String username = serverconnection.getProperty("Username");
		String password = serverconnection.getProperty("Password");
		String name = serverconnection.getProperty("Databasename");

		Element results = doc.createElement("Results");
		doc.appendChild(results);

		Class.forName(treiber);
		Connection con = DriverManager.getConnection(datenbank,
				username, password);

		System.out.println("Enter SQL Code:");
		Statement stmt = con.createStatement();
		String sqlabfrage = new java.util.Scanner(System.in).nextLine();
		ResultSet rs = con.createStatement().executeQuery(sqlabfrage);

		ResultSetMetaData rsmd = rs.getMetaData();
		int colCount = rsmd.getColumnCount();

		while (rs.next()) {
			Element row = doc.createElement("Row");
			results.appendChild(row);

            
			for (int i = 1; i <= colCount; i++) {
				String columnName = rsmd.getColumnName(i);
				Object value = rs.getObject(i);
				Element node = doc.createElement(columnName);
				node.appendChild(doc.createTextNode(value.toString()));
				row.appendChild(node);
			}
		}


		DOMSource domSource = new DOMSource(doc);
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer transformer = tf.newTransformer();
		transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
		transformer.setOutputProperty(OutputKeys.METHOD, "xml");
		transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
		StringWriter sw = new StringWriter();	
		StreamResult sr = new StreamResult(sw);

		
		transformer.transform(domSource, sr);
	
		File file = new File("newxml.xml");
  		BufferedWriter bw = new BufferedWriter
  		(new OutputStreamWriter(new FileOutputStream(file)));
  		bw.write(sw.toString());
  		bw.flush();
  		bw.close();
        

		con.close();
		rs.close();
		}






	}


wenn ich ihn ausführe erscheint in der console die anweisung den sql befehl einzugeben und auf eingabe des befehls wird eine xml datei erstellt.
wenn ich also zum beisiel "Select ID from TABELLEN_NAME where ID like '1***%' " eigebe wird folgende datei erstellt und in der Projectmappe abgespeichert:
Java:
<?xml version="1.0"?>
<Results>
<Row>
<ID>1****</ID>
</Row>
<Row>
<ID>1****</ID>
</Row> ... 
</Results>
so wie es sein sollte.
wenn ich die datei mit den editor öffne sieht sie so aus :
Java:
<Results><Row><ID>1****</ID></Row>...</Results> [/Java] bis hierhin stimmt alles.

wenn ich jedoch anstatt obrigen SQL folgendes eingebe "Select Name from TABELLEN_NAME where name like 'e%' "

wird zwar ebenfalls ein xml dokument erstellt welches wenn ich es öffne lediglich folgendes enthält: [code=Java]e******* V*** G****** G****** S****** G***** e******** t**** G******** ...
jedoch im editor geöffnet sieht es wieder ganz normal aus:
Java:
<Results><Row><NAME>e****</NAME></Row><Row><NAME>e* V**** G***</NAME></Row
><Row><NAME>e*** G***</NAME></Row>...</Results>

wenn ich die Leerzeichen durch zB untenstriche ersetze (zB ...<NAME>e*_V****_G***</NAME>...)

und diese Änderung speichere bekomm ich ein genauso schönes Dokument wie bei der ersten abfrage nur eben anstatt der <ID>...</ID> mit <NAME>...</NAME> . Und ich weiß echt nicht wie ich das ändern kann.
 
S

SlaterB

Gast
hmm, mir kommt inzwischen der Gedanke, dass das nicht wirklich ein Java-Problem ist,
die Datei wird anscheinend bestens erstellt, wie du es mit einem Editor selbst getippt auch nicht besser hinbekämst,
nur dann 'wenn ich es öffne' scheint kein Editor zu sein, irgendeine XML-Ansicht z.B. im Browser?

was die benötigt ist nun nicht gerade ein Java-Problem..,
außer du weißt zu Leerzeichen Bescheid, " " kann man dazu vielleicht als Alternative tippen oder anderes,
suche im Internet danach, ich persönlich kann jedenfalls nicht beurteilen was dein XML-Programm an Wünsche hat

ob man TransformerFactory dazu noch konfigurieren kann weiß ich auch nicht,
eine offensichtliche Lösung ist, im String aus dem StringWriter eine Ersetzung durchzuführen,
falls überhaupt eine akzeptable Variante vorhanden ist,

erstmal nur mit Editor eine XML-Datei mit allen Spezialfällen zusammenbauen,
danach versuchen, diese Datei mit Java-Mittel zu erstellen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K XML-schreiben aus ResultSet dauert zu lange XML & JSON 10
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
E JTreedaten in eine XML Datei speichern XML & JSON 3
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4
N Java Code aus XML Datei generieren XML & JSON 8
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
K Kurze XML Datei Parsen XML & JSON 5
S XSD-Datei zulässige Werte auslesen XML & JSON 3
M XML Datei heapspace erreicht XML & JSON 3
M Große Datei auslesen/in dieser suchen XML & JSON 2
S Konforme XML Datei über XSD erstellen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
M XML Datei drucken XML & JSON 8
T Daten aus Programm in XML Datei speichern XML & JSON 2
D XSD Datei erstellen XML & JSON 4
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
G txt. Datei in xml datei konvertieren XML & JSON 21
K XML Datei in ein Java package „einbinden" XML & JSON 3
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
C if-Abfrage mit Datei Variable aus XML-Datei XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
sylo DOM Document in XML Datei schreiben XML & JSON 5
F XML Datei in Java einlesen XML & JSON 4
J Objektstruktur aus XML-Datei erzeugen XML & JSON 21
D ID's aus XML Datei rauslesen und in Java ausgeben XML & JSON 7
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
ARadauer Aus XML Datei Objekte erstellen... XML & JSON 3
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
H xml-Datei mit Attributen einlesen XML & JSON 3
A XML-Datei: Ab wann kritische Größe erreicht? XML & JSON 4
multiholle XML Datei elegant verarbeiten XML & JSON 14
M XMI-Datei auslesen XML & JSON 4
T Ließt keine XML Datei XML & JSON 2
R JAXB: Aus einem Vector oder List XML Datei erstellen XML & JSON 1
J XML-Datei ein Array einlesen XML & JSON 10
M xml - datei erstellen XML & JSON 2
T Wie einen String(XML Inhalt) in eine XML Datei speichern? XML & JSON 8
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
H XML-Datei in einzelne XML-Dateien zerlegen XML & JSON 2
G Tags oder Zeilen der Not-Validen XML-Datei XML & JSON 7
C Suche in XML-Datei XML & JSON 6
D Zeilennummer in der XML - Datei XML & JSON 5
S Einlesen einer xml Datei XML & JSON 4
M Datei parsen XML & JSON 5
S PDF Erzeugung - Probleme mit der XML Datei bei Schema-Infos XML & JSON 2
S XML Datei einlesen, aber root überspringen XML & JSON 2
T Werte in XML Datei an entsprechender Stelle einfügen XML & JSON 3
Saxony unbekannte XML Datei parsen und ausgeben XML & JSON 10
L XML Datei in Java angeben Pfad? XML & JSON 3
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
A SVG Datei auslesen und Batik XML & JSON 1
N neue XML-Datei erstellen mit vorhandener Struktur XML & JSON 18
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M brauche große XML-Datei für XPath-Tests XML & JSON 4
L mit Java eine HTML-Datei erstellen XML & JSON 3
L bz2-Datei parsen XML & JSON 9
A xml-schema aus wsdl auslagern in eine eigene xsd-Datei XML & JSON 3

Ähnliche Java Themen

Neue Themen


Oben