Hilfe zu Typ bzw. Klasse (verzweifelt)..?!?!



  • Hi.
    Ich bin nun eigentlich wirklich kein Neuling mehr in Java.
    Doch hin und wieder stoße ich dann doch recht heftig auf meine Grenzen :(.

    Ich schreibe gerade einen IRCBot.
    Dazu ist es so dass ich Daten aus einer XMLDatei Lese und diese
    da auch wieder reinschreiben möchte.

    Das Problem welches ich habe tritt auf, wenn ich Daten in die XML Datei schreiben möchte.
    Ich verwende für den XMLKrams JDom (www.jdom.org) eigentlich ganz fein.
    Jedoch meine Grenze:
    die Funktion welche ich benötige um Daten in die Datei zu schreiben sieht folgendermaßen aus:

    Class XMLOutputter
    protected void
    printElement(java.io.Writer out, Element element, int level, XMLOutputter.NamespaceStack namespaces)

    Quelle: http://www.jdom.org/docs/apidocs/index.html

    Also ich bin mit Funktionen und Klassen ja schon soweit vertraut, dass mir java.io.Writer ein Begriff ist.
    Ich muss also ein Object vom Typ ..Writer erstellen und setze den dann da rein.
    D.h. ich könnte die Funktion ungefähr folgendermaßen aufrufen:

    read ist mein Object vom Typ Element.

    FileOutputStream streamout = new FileOutputStream("/home/klaus/.mybot/messages/klaus"); 
    XMLOutputter xmloutput = new XMLOutputter(); 
    xmloutput.printElement(streamout, read, 0, ??? );
    

    Alles ist klar und logisch bis auf dem letzten Parameter dort soll ich
    XMLOutputter.NamespaceStack namespaces hineinpacken.
    Wenn ich mir die Klasse Namespacestack angucke...dann steht da ein sehr merkwürdiger Konstruktor:
    XMLOutputter.NamespaceStack

    Und wenn ich versuche ein Objekt zu erzeugen mit:

    XMLOutputter.NamespaceStack huhn = new XMLOutputter.NamespaceStack();
    

    Dann kommt the Type XML.Outputter.NamespaceStack ist nicht visible.
    D.h. ja eigentlich, dass es etwas mit den Modifikatoren mit protected
    usw. zu tun hat.
    Aber wo zum Teufel soll ich Ansetzen?

    Mein grösstes Problem ist, dass ich nicht weiss, WAS ich nicht weiss.
    Dass heisst ich habe keine Ahnung unter was ich nachgucken soll, welches Wissen mir fehlt, damit ich weiterkommen könnte.
    Deshalb auch der leicht "undefinierte" Titel.
    Deswegen habe ich angefangen ein wenig Literatur zu wälzen und bin auf
    innere Klasse gestoßen usw..
    Jedoch hat mir all das nicht weitergeholfen.

    Kann mir jemand sagen was das überhaupt ist?
    Warum es nicht klappt?
    Was da hinten reinsoll?! Ich habe leider überhaupt keine Idee/Plan.
    Oder wenn Ihr eine tolle Adresse habt wo ich das nachlesen kann wäre ich euch auch sehr dankbar.
    Da ich im Moment leider wirklich nicht weiter weiss.

    Dankeschön im Voraus.



  • Hallo,

    zur Ausgabe von XML in Dateien bzw. Streams gibt es die output-Methoden.

    Beispiel:

    Document doc;
    
    // ...
    
    XMLOutputter outputter = new XMLOutputter(" ",true);
    FileOutputStream output = new FileOutputStream("datei.xml");
    outputter.output(doc,output);
    

    Die printElement-Methode, XMLOutputter.NamespaceStack etc. sind Implementierungsdetails und werden z.B. in den entsprechenden output-Methoden genutzt. Diese Methoden wären für dich nur interessant, wenn du selbst von XMLOutputter ableitest.

    Fazit: nutze output(...) anstatt printElement(...)

    MfG



  • Ah...verstehe... zum Teil :).
    Erstmal Danke für Deine Antwort.

    Ich wollte printElement() benutzen, weil ich dachte das es effizienter ist,
    dann muss ich jetzt halt mal gucken wie ich das regeln kann.

    Kannst Du mir vielleicht noch sagen, unter welchem Stichwort ich weiterlesen muss damit ich verstehen WAS printElement() bzw. welches Konzept da _insgesamt_ hinterstehtt?
    Weil Du hast es ja offensichtlich verstanden sonst könntest Du mir ja recht schlecht Ratschläge geben.

    Also ich denke Stichworte würden ausreichen wie "Guck Dir das Klassenkonzept an, mit Schwerpunkt auf Vererbung" oder so.
    Weil es ist für mich schon wichtig dass ich es auch prinzipell verstehe, damit ich das nächste mal nicht wieder an so einer Stelle hängenbleibe.

    Aber trotzdem, nochmals vielen Dank!
    🙂



  • Hallo,

    hier findest du zunächst mal den Quelltext der Klasse "NamespaceStack":

    http://pistos.pe.kr/javadocs/etc/jdom-b9/j2h/org/jdom/output/NamespaceStack.java.html

    Die Klasse "NamespaceStack" ist nicht-öffentlich, also nur im Package sichtbar.
    Von aussen kannst du folglich nicht auf diese Klasse zugreifen, was auch so gewollt ist, weil es ja nur eine Hilfsklasse ist.

    Nun der Quelltext von "XMLOutputter":

    http://pistos.pe.kr/javadocs/etc/jdom-b9/j2h/org/jdom/output/XMLOutputter.java.html

    Scroll mal fast ganz runter, dann findest du folgendes Code-Stück:

    /**
         * Factory for making new NamespaceStack objects.  The NamespaceStack
         * created is actually an inner class extending the package protected
         * NamespaceStack, as a way to make NamespaceStack "friendly" toward
         * subclassers.
         */
        protected NamespaceStack createNamespaceStack() {
           // actually returns a XMLOutputter.NamespaceStack (see below)
           return new NamespaceStack();
        }
    
        /**
         * Our own null subclass of NamespaceStack.  This plays a little
         * trick with Java access protection.  We want subclasses of
         * XMLOutputter to be able to override protected methods that
         * declare a NamespaceStack parameter, but we don't want to
         * declare the parent NamespaceStack class as public.
         */
        protected class NamespaceStack
            extends org.jdom.output.NamespaceStack
        {
        }
    

    Wie oben erwähnt, ist die Klasse NamespaceStack nicht-öffentlich, also nur im Package sichtbar. Wenn du nun von XML-Outputter erbst hättest du normalerweise keinen Zugriff auf diese Klasse (bzw. NamespaceStack ist nicht sichtbar). Um die geschützte Klasse NamespaceStack in von XMLOutputter abgeleiteten Klassen trotzdem sichtbar zu machen wird daher in XMLOutputter eine innere Klasse NamespaceStack erzeugt, die von der Package-geschützten Klasse NamespaceStack (siehe oben) erbt.
    Leitest du nun von XMLOutputter ab, kannst du in der abgeleiteten Klasse jetzt auch NamespaceStack-Objekte benutzen.
    => die Package-geschützte Klasse NamespaceStack wird so also den von XMLOutputter abgeleiteten Klassen zugänglich gemacht, muss aber trotzdem nicht öffentlich gemacht werden.
    Schau dir einfach mal die Kommentare bei diesem Codestück an, daraus sollte einiges klarer werden.
    Wenn du weitere Infos zu dem Thema suchst, dann google einfach mal nach "Java access protection" oder ähnlichem.

    Ich hoffe, das war jetzt einigermaßen verständlich 🙂

    Deine erwähnte printElement() Methode ist übrigens auch in dem Quelltext zu finden, da kannst du dir ja mal ansehen, wie das Ganze zusammen mit den output-Methoden funktioniert.

    MfG

    // Nachtrag: du hast ja eigentlich nach dem Sinn der printElement() Methode gefragt. Die printElement Methode ist eine Hilfsmethode, die von den output-Methoden genutzt wird, ist aber nicht dazu bestimmt, von "aussen" aufgerufen zu werden, deshalb ist sie auch protected. Die Methoden, die auf ein XMLOutputter-Objekt aufgerufen werden sollen, sind z.B. die öffentlichen output-Methoden.
    Von daher könnte die printElement() Methode auch private sein, sie ist aber protected, damit von XMLOutputter abgeleitete Klassen sie auch überschreiben können.

    P.S.: Hier findest du eine gute Seite zum Thema Java und Vererbung:

    http://www.vererbung.com/pagelist.html

    Vor allem Seite 2 und 3 sind interessant!



  • Wow!
    Dankeschön für Deine Arbeit und Mühe! 🙂
    👍


Anmelden zum Antworten