javax.xml.transform.Source

LILA

Aktives Mitglied
Hallo Forum,

war mir nicht ganz sicher, ob ich die Frage unter "XML" stellen soll....
Dachte aber, dass sie doch eher unter Anfängerfrage fällt, da sie sehr elementar ist.?

Ich habe einen Webservice, den ich so aufrufe:

Java:
Source ergebnisXML = port.funktion(parameter1, parameter2);

die Funktion des Webservice liefert also als Rückgabewert ein Interface "javax.xml.transform.Source" zurück.
Frage 1.) Wie kann es sein, dass der Rückgabetyp einer Funktion ein Interface ist?
Darf das überhaupt sein?

Frage 2.) Wie könnte ich die Source so bearbeiten, dass mir später in einer Webseite einfach ein XML-Dokument ausgegeben wird?
Geht das überhaupt? Würde gerne JDOM nutzen...

Bin um jeden Ratschlag dankbar....

Liebe Grüße
LILA
 
besser spät als nie:
natürlich kann ein Interface oder eine Superklasse zurückgegeben werden, eine wichtige Funktion in der Polymorphie,
wenn du selber WebService-Klassen erstellst oder sonst irgendwo irgendwann man etwas ableitest, z.B. ActionListener in Swing,
dann werden diese neuen Klassen auch in internen Frameworks als Superklassen bzw. Interfaces herumgereicht,
sonst könnte man ja gar nix mit den neuen Klassen machen

fraglich ist nur, ob auch die implementierende Klasse überall bekannt ist, wenn sie denn doch gebraucht wird um den Code auszuführen,
gerade bei Übertragung im Netzwerk von einem Programm zum nächsten ist das durchaus ein Thema bei eigenen Klassen,
na wird sich schon per Exception bemerkbar machen wenn es ein Problem gibt

aus einem Source eine Datei zu schreiben ist ein Standard-Thema bei XML, siehe z.B. die Links in diesem Thema:
http://www.java-forum.org/allgemeine-java-themen/107130-xml-datei-schreiben-org-w3c-dom.html
 
Hallo,

erstmal vielen Dank für die Antwort.

Ich bin mir jetzt nicht ganz sicher, ob ich die Antwort vielleicht falsch verstanden habe.
Aber mein Problem ist, dass ich ja kein "richtiges" XML-File als Input habe, sondern diese Source.
Diese würde ich gerne irgendwie in eine InputSource packen. Dies versuche ich so:

Java:
javax.xml.transform.Source ergebnisXML = port.funktion(parameter1, parameter2);
InputSource input = new InputSource(ergebnisXML);

Aber in die InputSource kann ich nur Charakter-Streams und Byte-Streams packen.
Anscheinend ist die Source keine Charakter oder Byte-Source????
Nun suche ich schon ewig nach irgendeiner Klasse, von welcher ich ein Objekt bilden kann, in welches ich dann meine Source packe um diese dann anschließend in einem Browser wieder auszugeben.

Aber ich finde keine Klasse, welche mir diese Source verarbeiten kann?

Oder liegt es vielleicht doch daran, dass diese javax.xml.transform.Source nur ein Interface ist? Und ich sie deshalb nicht in andere Objekte "stecken" kann.

Tut mir leid, wenn ich so komisch frag. Sorry.

Schöne Grüße
 
aus einer Source eine InputSource zu machen ist anscheinend nicht vorgesehen, vielleicht musst du das aber auch gar nicht,
was genau hast du denn im weiteren vor?

wie ich durch den den Link angedeutet habe, landen eingelesene Daten normalerweise doch irgendwann bei einem Transformer, und der mag Source eh lieber,
eine InputSource ist eher etwas, was man mit Aufwand in eine Source umwandelt,
z.B DocumentBuilder liefert Document aus InputSource, welches man dann per DOMSource als Source in den Transformer steckt

wenn du aber nicht eine Source für Tranformer brauchst, sondern z.B. ein Document, dann kann dir Transformer vielleicht doch helfen, denn der wandelt Sources in Results um und ein möglicher Result-Typ ist DOMResult, welches letztlich einen Root-Node liefert, was wohl quasi ein Document ist,
möchtest du SAX-Verarbeitung, dann hilft SAXResult bestimmt weiter

verwirrend viele Begriffe, ich sehe da auch selber nicht unbedingt durch, quasi noch nie verwendet,
aber erklär doch was du genau brauchst,
stell dir vor an deiner problematischen Stelle hättest du eine InputSource, was würdest du dann damit machen?
 
Hallo, vielen Dank schon mal für die Hilfe.
Das sind wirklich viele Begriffe. Wenn man sowas lernt ist es sehr verwirrend 🙂

Was ich eigentlich machen will ist folgendes:

Ich habe ein Servlet das bisher wie folgt aussieht:

Java:
package clientservlet;

import org.jdom.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.jdom.output.XMLOutputter;
import org.w3c.dom.Node;

public class MeldungsReport extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {

            String servletID = request.getParameter("MeldungsabfrageID");
            String servletUser= request.getParameter("MeldungsabfrageNutzer");
            String servletStartTime = request.getParameter("MeldungsabfrageStartzeit");
            String servletEndTime = request.getParameter("MeldungsabfrageEndzeit");

            XMLGregorianCalendar startTime = null;
            XMLGregorianCalendar endTime = null;

            unserpackage.WebImporterService service = new WebImporterService();
            unserpackage.ImisSoapWebImporter port = service.getImisSoapWebImporter();
            Source ergebnisXML = port.getImportMeldungen(servletID, servletUser, startTime, endTime);

            out.println("<html>");
            out.println("<head>");
            out.println("<title>Meldungs Report</title>");
            out.println("</head>");
            out.println("<body>");
            
                      try {
                      SAXBuilder builder = new SAXBuilder();
                      Document doc = builder.build( new File( 

                           hierhinein würde ich dann meine Source schreiben, 
                           was so natürlich nicht möglich ist!!!!!!!!!!!!!! ) );

                      XMLOutputter myOutput = new XMLOutputter();
                      myOutput.output( doc, out );
                    } catch( Exception ex ) {
                      ex.printStackTrace();
                    }

            out.println("</body>");
            out.println("</html>");

        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

Um es nochmal kurz zusammen zu fassen, ich würde also gerne diese Source die ich da bekomme einfach als XML-file auf einer Webseite durch mein Servlet darstellen. Nur irgendwie kann ich mit dieser Source nix anfangen, die ich von dem Webservice bekomme....

Grüße
LILA
 
Zuletzt bearbeitet:
es geht also darum, am Ende ein XML-Dokument in Textform zu erhalten,
da ist zum einen mein Link aus der ersten Antwort interessant, denn dort ist auch genau die Frage, wie man XML ausgibt
und unter anderem erwähnt (wieder nur per Links) mit Transformer eine Source (wie du sie hier hast) zu verarbeiten

Java:
TransformerFactory tFactory =   TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
StreamResult result = new StreamResult(out); // out wie du es vorliegen hast
transformer.transform(source, result); // da ist die source
tuts vielleicht

und wie in meiner letzten Antwort hier halb erwähnt der Wer zum Document, damit du von da deinen bekannten Weg nehmen kannst:
Java:
TransformerFactory tFactory =   TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMResult result = new DOMResult(); 
transformer.transform(source, result); // da ist die source
// hier nun result.getNode() oder so aufrufen, habe ich jetzt eh nur aus der API abgeschaut, noch nie benutzt
 
Super vielen Dank,

ich kann mein File jetzt ausgeben.
Jetzt muss ich nur noch bissi formatieren.
Aber das werd ich schon hin bekommen.

Juhu 🙂
 

Neue Themen


Zurück
Oben