XML-Stream als Quelle für FOP

thommy.s

Aktives Mitglied
Hallo,

ich habe mir in einer Anwendung aus einer DB-Abfrage eine XML-Struktur gebaut, aus der ich per FOP-Engine ein PDF erzeugen will. Ich möchte aber die Struktur nicht als Datei zwischenspeichern, sondern die Struktur direkt verwenden.

Nun ja, mit JDOM konnte ich mir bislang nur einen OutputStream erzeugen, brauch aber als eine der beiden Quellen für FOP (die andere ist die XSLT-Datei) einen InputStream. Ich habe zwar gelesen, dass man den OutStream in einen InputStream einlesen kann, dabei aber laut JavaDoc einen zweiten Thread erzeugen soll, um einem möglichen Deadlock vorzubeugen. Diese Vorgehensweise kommt mir doch sehr umständlich vor.

Deshalb meine Frage: Geht es evt. auch anders, auf einem etwas eleganteren Weg, den ich bisher selbst nicht sehe?

Würde mich freuen, wenn mir jemand das Brett vorm Kopf etwas lockern könnte.

Viele Grüße

Thomas
 
S

SlaterB

Gast
was verwendest du genau, TransformerFactory, Source, Result?

es gibt eine Klasse DOMSource, die kann mit einem DOM-Baum direkt umgehen,
ansonsten müsstest du einen Zwischenschritt einbauen, der DOM in eine TXT-Form, eben XML, umwandelt,
was auch wieder TransformerFactory oder ähnliches leisten kann,

da kommt dann zum Beispiel ein OutputStream raus, der als InputStream woanders dienen kann:
Convert a Java OutputStream to an InputStream
edit: ok, hast du auch schon geschrieben,
ja Probleme gibts da schon, wenn alles ein Thread nacheinander macht dann werden eben erst die Daten geschrieben,
wo sollen die hin wenn ein PipedOutputStream nur begrenzten Buffer hat und pausiert bis nicht irgendjemand (der zweite Thread) was ausliest?
mit Zwischenspeicherung in byte-Array oder Datei gibts dann aber gewiss weniger Probleme
 
Zuletzt bearbeitet von einem Moderator:

thommy.s

Aktives Mitglied
danke dir schon mal für die Antwort.

Ich bin noch nicht so firm, was FOP angeht, deshalb kann ich dir leider noch gar nicht sagen, was ich denn verwenden werde. Wollte mir erst einmal die Ausgangsbedingungen schaffen, um dann mit FOP voll zuschlagen zu können. Die hab' ich nun soweit, nur dass ich eben einen InputStream brauche, um nicht mit dem Zwischenschritt XML-Datei arbeiten zu müssen. Die XSLT-Datei sollte kein größeres Problem werden, so hoffe ich.

Aber ich werde mal deinem Link folgen und es mit den pipes versuchen, obwohl ich's noch nicht so recht verstehe...

Grüße Thomas
 

thommy.s

Aktives Mitglied
hab es nun, aus meiner Sicht wesentlich einfacher, gelöst:

Den OutputStream in ein ByteArray gepackt, und dieses als Quelle für den InputStream benutzt, siehe:

Java:
public InputStream createXMLStream(int woche) {
		
		Properties p = new Properties();
		
		ByteArrayOutputStream pos = (ByteArrayOutputStream) this.prepareData(woche);
		
		try {
			
			p.store(pos, "");
			
		} catch (IOException e) {
			
			e.printStackTrace();
			
			return null;
		}
		
		ByteArrayInputStream xmlin = new ByteArrayInputStream(pos.toByteArray());
		
		return xmlin;
		
		
	}

Damit geht's spitzenmäßig.

Grüße Thomas
 
Zuletzt bearbeitet:

thommy.s

Aktives Mitglied
...allerdings tritt ein neues Problem auf, welches ich vorher nicht als solches angesehen habe:

der SAX-Parser meldet:

Code:
System-ID unbekannt; Zeilennummer25; Spaltennummer1; Content is not allowed in trailing section.

Hab mir das XML als Datei ausgegeben, unter dem letzten ausführenden Root-Tag ist in 'gedit' eine weitere Zeile zu sehen, die aber leer ist. Die Zeilennummer, bei der der Fehler gemeldet wird, ist die erste, die nicht mehr existiert. Mit anderen Worten, hat meine XML-Datei bis nach dem letzten </root>-Tag insgesamt 23 Zeilen, wird noch eine weitere leere Zeile (also 24) angehängt, der Parser meldet den Fehler in 'Zeile 25' (siehe oben).

Die Methode, die den XML-Stream schreibt, hier:

Java:
public OutputStream prepareData(int woche) {
		
		ByteArrayOutputStream bas = new ByteArrayOutputStream();
		
		
		
		Document doc = new Document();
		
								
		ResultSet rs_ready = getResultSet(woche);
		
		try {
			
			Element root = new Element("root");
			
			String akt_datum = "";
			
			Element elDatum = null;
			
			while (rs_ready.next()){			
				
				if (!(rs_ready.getDate("datum").toString().equals(akt_datum))) {
					
					akt_datum = rs_ready.getDate("datum").toString();
					
					elDatum = new Element ("datum");
					
					elDatum.addContent(akt_datum);		
					
					root.addContent(elDatum);
										
				}					
				
				
				Element elDoing = new Element("taetigkeit");
					
				elDoing.addContent(rs_ready.getString("aktivitaet"));
				elDoing.setAttribute("kategorie", rs_query.getString("kategorie"));
				elDoing.setAttribute("auftraggeber", rs_query.getString("auftraggeber"));
				elDoing.setAttribute("von", rs_query.getString("von"));
				elDoing.setAttribute("bis", rs_query.getString("bis"));
				
				elDatum.addContent(elDoing);
				
				
				
			}
			
			doc.setRootElement(root);
			
			try {
			
				XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
				
				
				//DOMOutputter domout = new DOMOutputter().output(doc);
				//OutputStream output = new OutputStream("/file.xml");
		    
				outputter.output(doc,bas);
				
				outputter.output(doc, new FileOutputStream("out.xml", false));
				
				
				
			} catch (IOException e) {
				
				e.printStackTrace();
				
				return null;
			}
			
		} catch (SQLException e) {
			
			e.printStackTrace();
			
			return null;
		}
		
		return bas;
	}


Ich weiß nicht, wo diese letzte leere Zeile herkommt; lösche ich sie und verwende so die XML-Datei als Quelle, funktioniert es.

Warum wird hier eine Zeile zuviel geschrieben?

Ratlosigkeit

Thomas
Code:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M XML Stream Exception abfangen XML & JSON 10
B XML Stream unterbrechen und wiederaufnehmen XML & JSON 20
M XML Underlying stream encoding + doppelte vs. einfache Anführungszeichen XML & JSON 6
J XML als stream schreiben? XML & JSON 2
S Jackson: Erstellen Sie Klassen für Jackson aus XSD XML & JSON 2
N JAXB: Überflüssiges Wrapper-Tag für Map-Einträge XML & JSON 0
H Editor für Apache FOP XML & JSON 5
E Gibt es denn einen XML-Parser für JUnit-Tests? XML & JSON 6
A XMLRPC für Java XML & JSON 3
S Ersatz für die veraltete Klasse XPath XML & JSON 1
D ods./Excel Tabelle oder doch SQL für nen Anfänger? XML & JSON 5
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
R Rückgabewert für XML-Abschnitt XML & JSON 2
X JDom für SOAP Dateien geeignet? XML & JSON 3
D eine Schema für ein andere Schema XML XML & JSON 14
Z Tutorial für JDOM (XSD-Shema) XML & JSON 3
D [EMF,XSD] PatternMatcher für eigene Methoden benutzen XML & JSON 3
F Standard für das erstellen von XML? XML & JSON 4
H XML plattformunabhängig/Open Source für Java XML & JSON 4
G Idee für kleines Vorführprojekt XML & JSON 5
isowiz Welches Persistenzframework für XML? XML & JSON 3
T Java Klasse für gegebenes XML erstellen XML & JSON 4
B XML file für schtasks XML & JSON 5
G XPath gesucht für Tag mit konkretem Content XML & JSON 2
F beste lib für xml serialisierung - deserialisierung XML & JSON 4
HeRaider Steuerzeichen für Zeilenumbrüche XML & JSON 2
T Editor für XML-Dialekt entwickeln XML & JSON 3
M brauche große XML-Datei für XPath-Tests XML & JSON 4
M Best Practices für Data Binding ohne Hilfstools XML & JSON 14
A XML für Einstellungen - welche Strategie verwenden? XML & JSON 4
M XSL-File für Transformation verwenden XML & JSON 3
C Pfadangabe für Bilder XML & JSON 2
J Client für WebService programmieren (aus WSDL-File) XML & JSON 15
T DTD für XML-Instanz einbinden? XML & JSON 4
Z beispiel für valides Xml-Dokument durch XML-Schema XML & JSON 5
G XML als "Datenbank" für kleine Daten XML & JSON 2
D Suche eine OnlineQuelle für SAX XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben