tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von Akeshihiro
  • 1 Beitrag von hansmueller
  • 1 Beitrag von Vereth
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
753
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tinipieps Tinipieps ist offline Mitglied Silber
    Registriert seit
    Feb 2010
    Beiträge
    74
    Hallo!
    Ich wollte eine JComboBox mit Daten aus einer XML-Datei befüllen.
    Leider werden alle Einträge aus der xml-Datei zusammenhängend als Eintrag in der ComboBox ausgegeben.

    XML-Datei:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    <?xml version="1.0" encoding="UTF-8"?>
    <konfigurationen>
        <!--Adresse des Servers, ueber den Mail versendet werden soll-->
        <mailserver>mailserver.blabla.de</mailserver>
     
        <!--Festlegung aller moeglichen Absenderadressen-->
        <absender>
            <mail>Person1@blabla.de</mail>
            <mail>Person2@blabla.de</mail>
        </absender>
     
        <!--Festlegung aller Empfaengeradressen-->
        <empfaenger>
            <mail>Person1@blabla.de</mail>
            <mail>Person2@blabla.de</mail>
        </empfaenger>
     
        <!--Festlegung, ab manuell zusaetzliche Empfaenger eingetragen werden koennen-->
        <editierbar>nein</editierbar>
    </konfigurationen>


    Klasse, die Methode enthält, welche Absender aus XML ausliest
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    
    package adresses;
     
    import java.io.File;
    import java.io.IOException;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
     
    import application.Application;
     
    /**
     * Diese Klasse bietet alle Methoden, um die Konfigurationsdatei der 
     * moeglichen Absender auszulesen
     * @author Stepanski
     *
     */
    public class Sender {
        
        /**
         * Diese Methode liest Schlüssel der Datei aus 
         * und schreibt diese dann in ein String[]
         * @return  String[]  senderArray
         */
        public static String[ ] getSender() {
            
            //String[] anlegen
            String [ ] senderArray = null;
            NodeList tableNameNodeList;
            String tableName;
            
            // Daten aus config.xml auslesen
            try{
                DocumentBuilderFactory factory = DocumentBuilderFactory.
                                                                newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document = builder.parse(new File(Application.path+
                                                                "config.xml"));
                //NodeList = Liste, in der Eintraege gesammelt werden, ohne
                //Implementierung festzulegen
                tableNameNodeList = document.getElementsByTagName("absender");
                tableName = null;
     
                if (tableNameNodeList.getLength() > 0){
                    senderArray = new String[tableNameNodeList.getLength()];
                    for (int i=0; i<tableNameNodeList.getLength(); i++){
                    tableName = tableNameNodeList.item(i).
                                                getTextContent().toString();
                    senderArray[i] = tableName; 
                    System.out.println(tableName);
                                   
                }
            }
            }catch (IOException e){
                System.out.println("IO Fehler");
            }catch (ParserConfigurationException e){
                System.out.println("Parser Fehler");
            }catch (SAXException e){
                System.out.println("SAX Fehler");
            }
            
            return senderArray;     
        }
    }

    Klasse, die Methode getSender() benutzt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    
    package login;
     
     
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.Arrays;
     
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
     
    import adresses.Sender;
    import client.Client;
     
    /**
     * Diese Methode erzeugt ein LogIn-Fenster.
     * Bei Eingabe eines registrierten Nutzers mit dazugehörigem Passwort
     * wird das Hauptprogramm geöffnet.
     * @author Stepanski
     *
     */
    public class LogIn extends JFrame{
     
        private static final long serialVersionUID = 1L;
        
        /*Attribute*/
        Container container;
        JPanel p;
        
        JLabel user;
        static JComboBox cb1;
        
        JButton login;
        
        /*Konstruktor*/
        /**
         * Diese Methode enthält einen Konstruktor, welcher ein 
         * LogIn-Fenster erzeugt.
         */
        public LogIn(){
            super();
            this.createLogIn();
            
            this.setName("LogIn");
            this.setSize(400, 200);
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            int x = (d.width - getSize().width) / 2;
            int y = (d.height - getSize().height) / 2 ;
            setLocation(x, y);
            
            this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            this.setVisible(true);
            this.setResizable(false);
            this.pack();        
        }
     
        /**
         * Diese Methode legt das Aussehen des 
         * Panels auf dem LogIn-Fenster fest.
         */
        private void createLogIn() {
            
            Container cp = this.getContentPane();
            
            p = new JPanel();
            
            // GridBagLayout, um individuelles Aussehen zu ermöglichen
            GridBagLayout gbl = new GridBagLayout();
            p.setLayout(gbl);
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = 0;
            c.gridheight = 1;
            c.gridwidth = 1;
            c.insets = new Insets(10,10,10,10);
            
            user = new JLabel("Benutzername: ");
            p.add(user, c);
            
            ////////////////////////////////////////////////////////////
    [COLOR="Red"]        // ComboBox mit Adressen aufrufen
            cb1 =new JComboBox();
            c.gridx=1;
            c.gridwidth=2;
            p.add(cb1, c);
                    
            fillSenderCombo();[/COLOR]
            
            // KeyListener ermoeglicht Bestaetigung des Passwortes mit 
            // der Taste "ENTER"
            cb1.addKeyListener(new KeyListener () {
     
                @Override
                public void keyPressed(KeyEvent e) {
                    int key = e.getKeyCode();
                    if ( key == KeyEvent.VK_ENTER){
                                    
                        // Liste aller angelegten Nutzer
                        String nutzer = (String) cb1.getSelectedItem();
                        System.out.println(nutzer);
                        
                        // neues Hauptfenster oeffnen
                        Client client = new Client();
                        client.setAbsender(nutzer);
                                
                        // LogIn-Fenster "unsichtbar" machen
                        LogIn.this.setVisible(false);
                        // gibt Speicher wieder frei
                        dispose();
                    }else
                            JOptionPane.showMessageDialog(null, 
                                "Anmeldung fehlgeschlagen",
                                "Error Message", JOptionPane.ERROR_MESSAGE);                
                }
     
                @Override
                public void keyReleased(KeyEvent arg0) {
                    
                }
     
                @Override
                public void keyTyped(KeyEvent arg0) {
                    
                }
                
            }); 
            
            login = new JButton("ENTER");
            c.gridx = 3;
            c.gridy = 2;
            c.insets = new Insets(20,10,10,0);
            p.add(login, c);
            
            // gleiche Aktion wie bei KeyListener, nur das diesmal auf 
            // druecken des Buttons reagiert wird
            login.addActionListener(new ActionListener() {
                
                @Override
                public void actionPerformed(ActionEvent evt) {
                    String nutzer = (String) cb1.getSelectedItem();
                    System.out.println("Nutzer: "+nutzer);
                        
                    LogIn.this.setVisible(false);
                    // gibt Speicher wieder frei
                    dispose();
                        
                    Client client = new Client();
                    client.setAbsender(nutzer);
                }
            });
                
            cp.add(p, BorderLayout.CENTER);
            
        }
        
    [COLOR="Red"]   /**
         *  Diese Methode fuellt die JComboBox, welche im Auswahl-Dialog 
         *  eingebettet wird
         */
        public static void fillSenderCombo(){
            
            String [] adressen = Sender.getSender();
            Arrays.sort(adressen);
            for (String i:adressen) {
                System.out.println(i);
                cb1.addItem(i);
            }[/COLOR]
        }
    }

    Ausgabe in JComboBox:

    Ein Feld mit "Person1@blabla.orgPerson2@blabla.org"

    Was habe ich falsch gemacht?
    Wie bekomme ich es hin, dass beide Einträge einzeln in JComboBox aufgeführt werden?
     

  2. #2
    hansmueller hansmueller ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    78
    Hallo,

    xml ist noch nicht so meine Stärke, aber ich glaube, das Problem liegt in der Methode getSender().
    Das Sysout nach
    Code :
    1
    2
    
                    senderArray[i] = tableName; 
                    System.out.println(tableName);
    müßte eigendlich hier schon "Person1@blabla.orgPerson2@blabla.org" ausgeben, oder?

    MfG
    hansmueller
     

  3. #3
    Tinipieps Tinipieps ist offline Mitglied Silber
    Registriert seit
    Feb 2010
    Beiträge
    74
    Zitat Zitat von hansmueller Beitrag anzeigen
    Hallo,

    xml ist noch nicht so meine Stärke, aber ich glaube, das Problem liegt in der Methode getSender().
    Das Sysout nach
    Code :
    1
    2
    
                    senderArray[i] = tableName; 
                    System.out.println(tableName);
    müßte eigendlich hier schon "Person1@blabla.orgPerson2@blabla.org" ausgeben, oder?

    MfG
    hansmueller
    Also in der Console wird folgende Ausgabe sichtbar:


    Person1@blabla.org
    Person2@blabla.org

    Also, beide Einträge werden angezeigt, aber mit Zeilenumbruch. Bin deshalb davon ausgegangen, dass die Daten also auch "getrennt" in der JComboBox angezeigt werden.
    Geändert von Tinipieps (21.04.10 um 09:25 Uhr)
     

  4. #4
    Tinipieps Tinipieps ist offline Mitglied Silber
    Registriert seit
    Feb 2010
    Beiträge
    74
    Ah, mir ist soeben aufgefallen, das das sysout in der Methode getSender() 2x den soeben geposteten Beitrag liefert.
    Also, scheint hier der Fehler zu liegen:
    Er durchläuft zwar zweimal die Schleife, weil ja 2 Einträge in der xml-Datei vorhanden sind, aber scheinbar liefert er mir 2x den zusammengesetzten String.

    KOMISCH

    Liegt das nun an der Art, wie ich die xml-Datei auslese (ist für mich Neuland) oder ein meiner Methode? Kann den Fehler einfach nicht finden!
     

  5. #5
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Ich hab deine XML-Datei mal mit JDom verarbeitet und bin zu folgendem Ergebnis gekommen:

    Absender.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    package de.tutorials.tinipieps.sender;
     
    public class Absender {
        private String  mail;
     
        public void setMail(String mail) {
            this.mail = mail;
        }
     
        public String getMail() {
            return mail;
        }
    }
    Empfaenger.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    package de.tutorials.tinipieps.sender;
     
    public class Empfaenger {
        private String  mail;
     
        public void setMail(String mail) {
            this.mail = mail;
        }
     
        public String getMail() {
            return mail;
        }
    }
    Konfiguration.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    package de.tutorials.tinipieps.sender;
     
    import java.util.LinkedList;
    import java.util.List;
     
    public class Konfiguration {
        private String              mailServer;
        private List<Absender>      absender;
        private List<Empfaenger>    empfaenger;
        private boolean             editierbar;
     
        public Konfiguration() {
            absender = new LinkedList<Absender>();
            empfaenger = new LinkedList<Empfaenger>();
        }
     
        public List<Absender> getAbsender() {
            return absender;
        }
     
        public List<Empfaenger> getEmpfaenger() {
            return empfaenger;
        }
     
        public void setMailServer(String mailServer) {
            this.mailServer = mailServer;
        }
     
        public String getMailServer() {
            return mailServer;
        }
     
        public void setEditierbar(boolean editierbar) {
            this.editierbar = editierbar;
        }
     
        public boolean isEditierbar() {
            return editierbar;
        }
    }
    Parser.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    
    package de.tutorials.tinipieps.sender;
     
    import java.io.File;
    import java.io.IOException;
     
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
     
    public class Parser {
        private Element root;
     
        public Element getRootElement() {
            return root;
        }
     
        public Parser(String xmlPath) throws JDOMException, IOException {
            root = new SAXBuilder().build(new File(xmlPath)).getRootElement();
        }
     
        public Konfiguration parseKonfiguration() {
            Konfiguration konfiguration = new Konfiguration();
     
            Element el = null;
            if((el = root.getChild("mailserver")) != null) {
                konfiguration.setMailServer(el.getTextTrim());
            }
     
            // Absender
            if((el = root.getChild("absender")) != null) {
                for(Object o : el.getChildren("mail")) {
                    Element element = (Element)o;
                    Absender tmp = new Absender();
                    tmp.setMail(element.getTextTrim());
                    konfiguration.getAbsender().add(tmp);
                }
            }
     
            // Empfänger
            if((el = root.getChild("empfaenger")) != null) {
                for(Object o : el.getChildren("mail")) {
                    Element element = (Element)o;
                    Empfaenger tmp = new Empfaenger();
                    tmp.setMail(element.getTextTrim());
                    konfiguration.getEmpfaenger().add(tmp);
                }
            }
     
            return konfiguration;
        }
    }
    Und zum Schluss noch die Anwendung des ganzen ...
    Main.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    package de.tutorials.tinipieps.sender;
     
    import java.io.IOException;
     
    import org.jdom.JDOMException;
     
    public class Main {
        public static void main(String[] args) throws JDOMException, IOException {
            Konfiguration conf = new Parser("res/sender.xml").parseKonfiguration();
     
            System.out.println("Mailserver:");
            System.out.println(conf.getMailServer());
     
            System.out.println();
            System.out.println("Absender:");
            for(Absender a : conf.getAbsender()) {
                System.out.println(a.getMail());
            }
     
            System.out.println();
            System.out.println("Empfänger:");
            for(Empfaenger e : conf.getEmpfaenger()) {
                System.out.println(e.getMail());
            }
        }
    }

    Mit einer JComboBox hab ich es noch nicht probiert, mach ich mal eben, aber ich denke das sollte so klappen ...

    EDIT:
    So, hab mal eine Testgui gemacht und es klappt super mit der JComboBox ...
    Geändert von Akeshihiro (21.04.10 um 11:43 Uhr)
    Tinipieps bedankt sich. 
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  6. #6
    hansmueller hansmueller ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    78
    Ich glaube, ich habe es gelöst.
    Man muß sich sozusagen von Node zu ChildNode angeln.

    Hier ein exemlarischer Quellcode:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    import java.io.File;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
     
    public class MainProg
    { 
        
     
            public static void main (String[] args)
            {
                            
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder;
                try
                {
                    
                    
                    builder = factory.newDocumentBuilder();
                    
                    
                    Document document = builder.parse(new File("Pfad zu deiner config-Datei"));
                                    
                    NodeList nlnr = document.getElementsByTagName("absender");
                    
                    System.out.println("Anzahl der Nodes in nlnr: " + nlnr.getLength());
                    System.out.println("Die Node auf Index 0: " + nlnr.item(0));
                    
                    Node m = nlnr.item(0);
                    System.out.println("Name von Node m: " + m.getNodeName());
                    System.out.println("Hat m Kinder:" + m.hasChildNodes());
                    
     
                    NodeList nl = m.getChildNodes();
     
                    System.out.println("------------------------------------");             
                    for(int i = 0; i < nl.getLength(); i++)
                    {
                        System.out.println("in der Schleife");
                        if(nl.item(i).getNodeName().equals("mail"))
                        {
                            System.out.println("Treffer");
                            System.out.println(nl.item(i).getNodeName());                       
                            System.out.println(nl.item(i).getTextContent());
                            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXX");
                        }
                        else
                        {
                            System.out.println("Kein Treffer");
                            System.out.println(nl.item(i).getNodeName());                       
                            System.out.println(nl.item(i).getTextContent());
                            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXX");
                        }
                                        
                        
                    }
                    
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            
            }   
                
                    
    }

    Diesen Code funktioniert und du dürftest das schnell in deinen Code integrieren können.

    Das einzige was ich nicht verstehe ist, was die Nodeliste alles als Node zählt?

    MfG
    hansmueller
    Tinipieps bedankt sich. 

  7. #7
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Das ist eigentlich ganz einfach, jedes Tag ist ein Node. Dein Tag <Konfigurationen> ist ein Node, das die Tags <mailserver>, <absender>, <empfaenger> und <editierbar> als childnodes hat, welche alle in einer Liste aufgzählt werden, sobald du getChildNodes für den <Konfigurationen>-Node aufrufst. Absender hat wiederum die <mail>-Tags als childnode, die aber nicht als childnode des <Konfigurationen>-Tags gezählt werden; du musst dir das Ganze als eine Art Baumstruktur vorstellen, bei der alle direkten Unterknoten eines Knotens in einer Liste aufgezählt werden.
    Person1@blabla.de ist übrigens ein Node vom Typ TEXT_NODE.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  8. #8
    Tinipieps Tinipieps ist offline Mitglied Silber
    Registriert seit
    Feb 2010
    Beiträge
    74
    Zitat Zitat von hansmueller Beitrag anzeigen
    Ich glaube, ich habe es gelöst.
    Man muß sich sozusagen von Node zu ChildNode angeln.

    MfG
    hansmueller
    Danke erstmal für den Tipp. Eigentlich ja logisch, weil ich vor jedem absender ja noch <mail> stehen habe.

    Also, ich hab jetzt mal versucht, deinen Ansatz bei mir einzubauen:
    Problem: list.item(i) liefert 5 verschiedene eiträge, wobei nur 2 relevant sind (.equals("mail")).
    Da ich aber zuvor die Größe meines Arrays festlege, sind nun 3 Werte des Arrays nicht belegt.
    Ich weiß nicht, ob es daran liegt, aber ich kriege jetzt ne NullPointerException in der Klasse LogIn -> Methode: fillSenderCombo() -> Stelle: Arrays.sort(adressen);

    Und nun?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    if (childrenNodeList.getLength() > 0){
               
                    // Feststellung, das Node "absender" Kinder hat ("mail")
                    Node element = childrenNodeList.item(0);
                    System.out.println("Node: " + element.getNodeName()+
                                    " hat Kinder:" + element.hasChildNodes());
                    
                    // NodeList der Kinder
                    NodeList list = element.getChildNodes();
     
                    System.out.println("-----------------------------------");
                    int laenge = list.getLength();
                    System.out.println("Laenge des Arrays: "+laenge);
                    senderArray = new String[laenge];
                    System.out.println("-----------------------------------");
                    for (int i=0; i<laenge; i++){
                        if (list.item(i).getNodeName().equals("mail")){
                            System.out.println(list.item(i).getNodeName());                     
                            System.out.println(list.item(i).getTextContent());
                            valueName = list.item(i).getTextContent();
                            senderArray[i] = valueName; 
                            System.out.println(
                                "Nutzer in Liste der Absender uebernommen");
                            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXX");
                        }  else{
                            System.out.println(
                                    "Fehler beim Hinzufuegen der Absender");
                            System.out.println(list.item(i).getNodeName());                     
                            System.out.println(list.item(i).getTextContent());
                            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXX");
                        }
                    }
            }
            }catch (IOException e){
                System.out.println("IO Fehler");
            }catch (ParserConfigurationException e){
                System.out.println("Parser Fehler");
            }catch (SAXException e){
                System.out.println("SAX Fehler");
            }
     
            return senderArray;

    Ausgabe auf Konsole:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    Anzahl der Nodes in 'absender': 1, wobei die Node auf Index 0: [absender: null]
    Node: absender hat Kinder:true
    -----------------------------------
    Laenge des Arrays: 5
    -----------------------------------
    Fehler beim Hinzufuegen der Absender
    #text
     
            
    XXXXXXXXXXXXXXXXXXXXXXXX
    mail
    Person1@blabla.org
    Nutzer in Liste der Absender uebernommen
    XXXXXXXXXXXXXXXXXXXXXXXX
    Fehler beim Hinzufuegen der Absender
    #text
     
            
    XXXXXXXXXXXXXXXXXXXXXXXX
    mail
    Person2@blabla.org
    Nutzer in Liste der Absender uebernommen
    XXXXXXXXXXXXXXXXXXXXXXXX
    Fehler beim Hinzufuegen der Absender
    #text
     
        
    XXXXXXXXXXXXXXXXXXXXXXXX
    Exception in thread "main" java.lang.NullPointerException
        at java.util.Arrays.mergeSort(Unknown Source)
        at java.util.Arrays.sort(Unknown Source)
        at login.LogIn.fillSenderCombo(LogIn.java:175)
        at login.LogIn.createLogIn(LogIn.java:99)
        at login.LogIn.<init>(LogIn.java:54)
        at application.Application.main(Application.java:15)
     

  9. #9
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Ich empfehle dir, die eingelesenen Daten in einer LinkedList<String> zu speichern (findest du in java.utils, wie jede andere Collection auch), dann brauchst du nämlich keine Größenangeben zu machen. Wenn du mit dem Einlesen fertig bist, rufst du dann die toArray()-Methode auf.
    Warum er 5 Nodes statt 2 einliest, weiß ich nicht, womöglich sind das irgendwelche Verwaltungs-Nodes. Wenn es dich interessiert, musst du das noch genauer untersuchen. Wäre schön, wenn du dann deine Erkenntnisse hier veröffentlichst, ich bin nämlich auch auf den Grund gespannt.
    Tinipieps bedankt sich. 
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  10. #10
    Tinipieps Tinipieps ist offline Mitglied Silber
    Registriert seit
    Feb 2010
    Beiträge
    74
    Zitat Zitat von Vereth Beitrag anzeigen
    Ich empfehle dir, die eingelesenen Daten in einer LinkedList<String> zu speichern (findest du in java.utils, wie jede andere Collection auch), dann brauchst du nämlich keine Größenangeben zu machen. Wenn du mit dem Einlesen fertig bist, rufst du dann die toArray()-Methode auf.
    Warum er 5 Nodes statt 2 einliest, weiß ich nicht, womöglich sind das irgendwelche Verwaltungs-Nodes. Wenn es dich interessiert, musst du das noch genauer untersuchen. Wäre schön, wenn du dann deine Erkenntnisse hier veröffentlichst, ich bin nämlich auch auf den Grund gespannt.
    Auf eine ähnliche Idee bin ich grad selbst gekommen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    
    package adresses;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
     
    import application.Application;
     
    /**
     * Diese Klasse bietet alle Methoden, um die Konfigurationsdatei der 
     * moeglichen Absender auszulesen
     * @author Stepanski
     *
     */
    public class Sender {
        
        /**
         * Diese Methode liest Schlüssel der Datei aus 
         * und schreibt diese dann in ein String[]
         * @return  String[]  senderArray
         */
        public static String[ ] getSender() {
            
            //String[] anlegen
            String [ ] senderArray = null;
            //Liste anlegen, der Werte zunaechst uebergeben werden
            List<String> senderList = new ArrayList<String>();
            NodeList childrenNodeList;
            String valueName;
            
            // Daten aus config.xml auslesen
            try{
                DocumentBuilderFactory factory = DocumentBuilderFactory.
                                                                newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document = builder.parse(new File(Application.path+
                                                                "config.xml"));
                //NodeList = Liste, in der Eintraege gesammelt werden, ohne
                //Implementierung festzulegen
                // getElementsByTagName() gibt NodeList mit allen Elementen
                // des gegebenen Tag-Namens zurück
                // -> "mail"
                childrenNodeList = document.getElementsByTagName("absender");
                System.out.println("Anzahl der Nodes in 'absender': " + 
                                    childrenNodeList.getLength()+
                                    ", wobei die Node auf Index 0: " +
                                    childrenNodeList.item(0));
     
                valueName = null;
     
                if (childrenNodeList.getLength() > 0){
               
                    // Feststellung, das Node "absender" Kinder hat ("mail")
                    Node element = childrenNodeList.item(0);
                    System.out.println("Node: " + element.getNodeName()+
                                    " hat Kinder:" + element.hasChildNodes());
                    
                    // NodeList der Kinder erstellen
                    NodeList list = element.getChildNodes();
                    
                    System.out.println("-----------------------------------");
                    int laenge = list.getLength();
                    // for-Schleife ueber alle Elemente der NodeList list
                    for (int i=0; i<laenge; i++){
                        Node childrenElement = list.item(i);
                        System.out.println("Node: " + 
                                childrenElement.getNodeName()+" hat Kinder:" 
                                + childrenElement.hasChildNodes());
                        System.out.println("******************************");
                        
                        // wenn Name des NodeList-Eintrages gleich "mail"
                        if (list.item(i).getNodeName().equals("mail")){
                            // Name der Node
                            System.out.println(list.item(i).getNodeName());                     
                            // Name des Node-Eintrages
                            System.out.println(list.item(i).getTextContent());
                            //Name String uebergeben
                            valueName = list.item(i).getTextContent();
                            // String an List<String> uebergeben
                            senderList.add(valueName);
                            System.out.println(
                                "Nutzer in Liste der Absender uebernommen");
                            System.out.println("XXXXXXXXXXXXXXXXXXXXXXXX");
                        }  else
                            System.out.println(
                                    "Fehler beim Hinzufuegen der Absender");
                    }
            }
            }catch (IOException e){
                System.out.println("IO Fehler");
            }catch (ParserConfigurationException e){
                System.out.println("Parser Fehler");
            }catch (SAXException e){
                System.out.println("SAX Fehler");
            }
          
            // List an Array uebergeben
            senderArray = (String[])senderList.toArray(
                                    new String[senderList.size()]);
            return senderArray;     
        }
    }

    Falls ich den Grund für die "zuvielen" Nodes finde, werde ich euch natürlich in Kenntnis setzten.
    Find es ja komisch, dass alle 3 Nodes "#text" heißen und keine Kinder haben!
    Sollte jemand schon die Antwort kennen: Ich bin für jeden Hinweis dankbar!
     

  11. #11
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Gut, dass ich JDOM verwende xD Damit hatte ich noch solche Probleme Allerdings muss man dann eine externe Bibliothek mitschleppen ...
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  12. #12
    hansmueller hansmueller ist offline Mitglied Silber
    Registriert seit
    Sep 2008
    Beiträge
    78
    Falls ich den Grund für die "zuvielen" Nodes finde, werde ich euch natürlich in Kenntnis setzten.
    Find es ja komisch, dass alle 3 Nodes "#text" heißen und keine Kinder haben!
    Sollte jemand schon die Antwort kennen: Ich bin für jeden Hinweis dankbar!
    Ich habe es herausgefunden.
    Es sind die Zeilenumbrüche und Tabulatoren bzw. Leerzeichen zwischen den Tags in deiner config-Datei.

    Wenn du die config-Datei so aussehen läßt:
    Code :
    1
    
    <?xml version="1.0" encoding="UTF-8"?><konfigurationen><mailserver>mailserver.blabla.de</mailserver><absender><mail>Person1@blabla.de</mail><mail>Person2@blabla.de</mail></absender><empfaenger><mail>Person1@blabla.de</mail><mail>Person2@blabla.de</mail></empfaenger><editierbar>nein</editierbar></konfigurationen>
    bekommst du nur noch zwei Childnodes für den Node "empfaenger". Nämlich die zwei "mail"-Nodes.

    Dieses Verhalten könnte damit zu tun haben, daß das Packet org.w3c.dom, welches wir verwenden primär für html-Dateien ausgelegt ist und nicht für reine xml-Dateien.
    Man kann somit auch den Text zwischen den Tags abgreifen, was ja bei html teilweise nötig ist, und das waren die 3 "#text"-Nodes.
    Bei xml ist sowas (glaube ich zumindest) gar nicht erlaubt, da hier ein ganz stricktes Modell vorgegeben ist.

    MfG
    hansmueller
    Geändert von hansmueller (21.04.10 um 15:26 Uhr) Grund: Weitere Erläuterung
     

Ähnliche Themen

  1. Befüllen einer MySQL DB mit großen Daten
    Von ElJarno im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 7
    Letzter Beitrag: 21.05.10, 10:20
  2. GridView mit Daten aus DB befüllen
    Von keks1984 im Forum .NET Web und Kommunikation
    Antworten: 1
    Letzter Beitrag: 10.09.07, 13:23
  3. Antworten: 0
    Letzter Beitrag: 08.08.07, 10:39
  4. Antworten: 5
    Letzter Beitrag: 08.09.04, 17:08
  5. Dropdownlisten variable mit daten befüllen...
    Von Fenriswolf im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 10.12.03, 21:20