Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[XML] transform DOM als Servlet-Output

1 view
Skip to first unread message

Markus Enders

unread,
May 1, 2002, 11:58:48 AM5/1/02
to
Hi Leute,

ich habe ein Problem mit der Ausgabe eines DOM-Trees in einem Servlet.
D.h. ich habe einS ervlet, in dem ich intern ein DOM-Tree aufbaue.
Dieser Baum ist auch vollkommen korrekt und ich kann ich mittels
transform auch auf System.out ausgeben.

Jetzt dachte ich, ich nutze statt System.out einfach den
ServletOuputStream, den ich mittels
ServletOutputStream out=response.getOutputStream();
bekomme. Dieser ist auch so i.O, denn mittels out.println kann ich auch
was ausgeben.

Die Transformierung mache ich mit folgendem Code-Fragment:

DOMSource sourcetree=new DOMSource(document);
StreamResult result=new StreamResult();
result.setOutputStream(out);

transformer.transform(sourcetree,result);

Allerdings kommt es bei der transform Methode immer zu einem Error:
java.lang.NoSuchMethodError
at org.apache.xpath.DOM2Helper.getNamespaceOfNode(DOM2Helper.java:348)
at org.apache.xml.utils.TreeWalker.startNode(TreeWalker.java:359)
at org.apache.xml.utils.TreeWalker.traverse(TreeWalker.java:183)
at
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:325)
at mypackage.myclass.WriteXML(myclass.java:273)
........


Wenn ich statt out System.out als OutputStream verwende funktioniert die
Transform-Methode und der Output ist korrekt (natürlich auf dem
Bildschirm, nicht als Servlet-Output).

Kann mir jemand erklären, was da falsch läuft?
Wie generiert ihr euren XML-Output als Servlet-Ausgabe?
Auf XSLTs kann ich verzichten, da ich eigentlich keine Konvertierung der
XML-Daten brauche. Ich will nur den DOM-Tree als XML rausschreiben können.

Hab ich da was übersehen oder gar den ganz falschen Ansatz gewählt?

Ciao & schonmal vielen Dank
Markus

Sven Kuenzler

unread,
May 1, 2002, 12:49:46 PM5/1/02
to
"Markus Enders" <end...@mail.sub.uni-goettingen.de> schrieb im Newsbeitrag
news:3CD010B8...@mail.sub.uni-goettingen.de...

> DOMSource sourcetree=new DOMSource(document);
> StreamResult result=new StreamResult();
> result.setOutputStream(out);
>
> transformer.transform(sourcetree,result);


Versuch's damit:

PrintWriter out = response.getWriter();
transformer.transform(sourcetree, new StreamResult(out));

out.close();

HTH, Sven.....


Markus Enders

unread,
May 2, 2002, 5:11:38 AM5/2/02
to
Hi Sven,

Sven Kuenzler wrote:


>
> Versuch's damit:


Abgesehen davon, dass es netter ist, weil man die IOExceptions nicht
abfangen muss, ist das Ergebnis das Gleiche..


> PrintWriter out = response.getWriter();
> transformer.transform(sourcetree, new StreamResult(out));
>
> out.close();


führt ebenso zu:


java.lang.NoSuchMethodError
at org.apache.xpath.DOM2Helper.getNamespaceOfNode(DOM2Helper.java:348)
at org.apache.xml.utils.TreeWalker.startNode(TreeWalker.java:359)
at org.apache.xml.utils.TreeWalker.traverse(TreeWalker.java:183)
at
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:325)

at mypackage.myclass.WriteXML(myclass.java:272)

(Jetzt ist Zeile 272, die Zeile in der die transform Methode aufgerufen
wird).
Kann das Problem ggfs. auf Tomcat zurückzuführen sein? Oder auf
irgendeine andere Komponente? Als XML-Parser setze ich den Xerces ein
(war bei JBuilder 5 dabei).

Ich weiss gerade nicht, wo ich weiter suchen soll... Mache ich irgendwo
einen Denkfehler?

Ciao
Markus


Sven Kuenzler

unread,
May 2, 2002, 5:55:46 AM5/2/02
to

"Markus Enders" <end...@mail.sub.uni-goettingen.de> schrieb im Newsbeitrag
news:3CD102CA...@mail.sub.uni-goettingen.de...

> > PrintWriter out = response.getWriter();
> > transformer.transform(sourcetree, new StreamResult(out));
> >
> > out.close();
>
>
> führt ebenso zu:
> java.lang.NoSuchMethodError
> at org.apache.xpath.DOM2Helper.getNamespaceOfNode(DOM2Helper.java:348)
> at org.apache.xml.utils.TreeWalker.startNode(TreeWalker.java:359)
> at org.apache.xml.utils.TreeWalker.traverse(TreeWalker.java:183)
> at
>
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerId
entityImpl.java:325)
> at mypackage.myclass.WriteXML(myclass.java:272)
>
> (Jetzt ist Zeile 272, die Zeile in der die transform Methode aufgerufen
> wird).
> Kann das Problem ggfs. auf Tomcat zurückzuführen sein? Oder auf
> irgendeine andere Komponente? Als XML-Parser setze ich den Xerces ein
> (war bei JBuilder 5 dabei).

Sehr merkwürdiges Problem, vor allem wenn es mit System.out funktioniert.
Ich würde versuchen, sowohl Xalan als auch Xerces auf die aktuelleste
Version zu bringen. Ein anderes Problem könnte sein, wenn man mehrere
XML-Parser im Classpath hat, z.B. einen unter $CATALINA_HOME/common/lib und
den anderen und $webapp/WEB-INF/lib


Michael Probst

unread,
May 2, 2002, 6:14:01 AM5/2/02
to
Markus Enders wrote:

> java.lang.NoSuchMethodError

klingt für mich nach nem Problem mit irgendwelchen Bibliotheken.
Benutzt du zum kompilieren andere Versionen als zur Laufzeit?
Offensichtlich kompiliert dein Programm problemlos,
findet zur Laufzeit aber nicht die korrekten Klassen.

Gruss
Michael

Peter Votruba

unread,
May 3, 2002, 5:44:07 PM5/3/02
to

"Markus Enders" <end...@mail.sub.uni-goettingen.de> schrieb im Newsbeitrag
news:3CD010B8...@mail.sub.uni-goettingen.de...
> Hi Leute,
...

> Auf XSLTs kann ich verzichten, da ich eigentlich keine Konvertierung der
> XML-Daten brauche. Ich will nur den DOM-Tree als XML rausschreiben können.
>

Wenn du keine XSL-Transformation durchführen willst, brauchst du Xalan
nicht.
Um nur den DOM-Tree auszugeben, verwende XMLSerializer aus dem
Xerces-Package org.apache.xml.serialize:
new XMLSerializer(response.getWriter(), null).serialize(doc);
Hab ich bis jetzt auch noch nicht bei einem Servlet gemacht, ist aber
zumindest die Richtige Methode um einfach nur den DOM-Tree auszugeben.

Peter.

Markus Enders

unread,
May 6, 2002, 5:13:05 AM5/6/02
to
Hi,

erstmal an Dich und den anderen Antwortern vielen Dank.

Sven Kuenzler wrote:


> Ein anderes Problem könnte sein, wenn man mehrere
> XML-Parser im Classpath hat, z.B. einen unter $CATALINA_HOME/common/lib und
> den anderen und $webapp/WEB-INF/lib


U.a. damit hatte es was zu tun. Ich hatte bei JBuilder immer nur den
ClassPath meines Projektes angeschaut, aber nicht gesehen, dass in der
Runtime-Umgebung, die Reihenfolge der Klassen anders angegeben war, und
der XML-Parser, den ich unter der Entwicklungsumgebung verwendet habe,
dort an letzter Stelle stand...

Also, vielen Dank nochmal
Ciao
Markus

0 new messages