XML Anfänger, bestehenden Code vereinfachen

Billie

Erfahrenes Mitglied
Hellas!

Also, folgendes Problem. Ich habe eine XML Datei die wie folgt aufgebaut ist:

PHP:
<IRCServers>
     <IRCNetwork name="Tutorials.de">
        <IRCServer Server="irc.tutorials.de">
            <Description>Tutorials.de</Description>
        </IRCServer>
    </IRCNetwork>
    <IRCNetwork name="QuakeNet">
        <IRCServer Server="de.quakenet.org">
            <Description></Description>
            <Port>6669</Port>
        </IRCServer>
        <IRCServer Server="us.quakenet.org">
            <Description>QuakeNet: Random US server</Description>
            <Password>Hallo</Password>
        </IRCServer>
    </IRCNetwork>
</IRCServers>

Mit dieser XML Datei will ich in einem Programm arbeiten, weiß aber nicht wie ich das am Besten anstellen soll. Unten steht mein bisheriger Code, der die Liste der Server aus dem derzeit ausgewählten Network ausgibt. Aber wenn jetzt ein anderer Server ausgewählt wird, soll sich der gespeicherte Port selbst im TextField eintragen usw.

Ich versuche jetzt eine Frage zu formulieren. Also, ist es Besser ich schreibe eigene IRCNetwork/Server Klassen und instanziere diese einmal, speichere gleichzeit mit Enumerationen die Infos wie Port, Password. Oder ist es Besser ich lese wie bisher alles immer aus der XML Datei und wenn ja, dann geht es auch einfacher als so wie ich es bisher habe... mir gefallen diese vielen Schleifen einfach nicht.

PHP:
                NodeList nl = serversXML.getElementsByTagName("IRCNetwork");

                for(int i = 0; i < nl.getLength(); i++) {

                    Node n = nl.item(i).getAttributes().item(0);

                    if(n != null && n.getNodeValue().trim().length() > 0 && n.getNodeValue().trim() == networkComboBox.getSelectedItem()) {

                        if(nl.item(i).hasChildNodes()) {

                            NodeList nl2 = nl.item(i).getChildNodes();

                            for(int i2 = 0; i2 < nl2.getLength(); i2++) {

                                if(nl2.item(i2).getNodeName().equals("IRCServer")) {

                                    if(nl2.item(i2).hasChildNodes()) {

                                        NodeList nl3 = nl2.item(i2).getChildNodes();

                                        for(int i3 = 0; i3 < nl3.getLength(); i3++) {

                                            if(nl3.item(i3).getNodeName().equals("Description")) {

                                                if(nl3.item(i3).hasChildNodes() && nl3.item(i3).getFirstChild().getNodeValue().trim().length() > 0) {

                                                    serverComboBox.addItem(nl3.item(i3).getFirstChild().getNodeValue().trim());

                                                } else if(nl2.item(i2).hasAttributes() && nl2.item(i2).getAttributes().item(0).getNodeValue().trim().length() > 0) {

                                                    serverComboBox.addItem(nl2.item(i2).getAttributes().item(0).getNodeValue().trim());
                                                }
                                            } else if(nl3.item(i3).getNodeName().equals("Port")) {

                                            } else if(nl3.item(i3).getNodeName().equals("Password")) {

                                            }
                                        }
                                    } else if(nl2.item(i2).hasAttributes() && nl2.item(i2).getAttributes().item(0).getNodeValue().trim().length() > 0) {

                                        serverComboBox.addItem(nl2.item(i2).getAttributes().item(0).getNodeValue().trim());
                                    }
                                }
                            }
                        }
                    }
                }
 

Anhänge

  • login[1].gif
    login[1].gif
    6,7 KB · Aufrufe: 63
Hallo!

Ich würde dir empfehlen ein XML Schema oder zumindest mal eine DTD für dein XML File zu entwerfen um das Dokument auf Gültigkeit untersuchen zu können...

Hier mal ein Beispiel für XPath:
Code:
<IRCServers>
     <IRCNetwork name="Tutorials.de">
        <IRCServer Server="irc.tutorials.de">
            <Description>Tutorials.de</Description>
            <Password></Password>
            <Port></Port>
        </IRCServer>
    </IRCNetwork>
    <IRCNetwork name="QuakeNet">
        <IRCServer Server="de.quakenet.org">
            <Description></Description>
            <Password></Password>
            <Port>6669</Port>
        </IRCServer>
        <IRCServer Server="us.quakenet.org">
            <Description>QuakeNet: Random US server</Description>
            <Password>Hallo</Password>
            <Port>6669</Port>
        </IRCServer>
    </IRCNetwork>
</IRCServers>

Code:
/**
 * 
 */
package de.turoials;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
 * @author Darimont
 */
public class XMLExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		InputSource is = new InputSource(XMLExample.class
				.getResourceAsStream("data.xml"));

		XPath xPath = XPathFactory.newInstance().newXPath();
		NodeList ircNetworks = (NodeList) xPath.evaluate(
				"/IRCServers/IRCNetwork", is, XPathConstants.NODESET);

		for (int len = ircNetworks.getLength(), i = 0; i < len; i++) {
			Node node = ircNetworks.item(i);
			System.out.println("Network: "
					+ xPath.evaluate("@name", node, XPathConstants.STRING));

			NodeList ircServerList = (NodeList) xPath.evaluate("IRCServer",
					node, XPathConstants.NODESET);

			for (int serverCnt = ircServerList.getLength(), j = 0; j < serverCnt; j++) {
				Node ircServer = ircServerList.item(j);
				System.out.println("Server: "
						+ xPath.evaluate("@Server", ircServer,
								XPathConstants.STRING));

				System.out.println("Description: "
						+ xPath.evaluate("Description", ircServer,
								XPathConstants.STRING));

				System.out.println("Password: "
						+ xPath.evaluate("Password", ircServer,
								XPathConstants.STRING));

				System.out.println("Port: "
						+ xPath.evaluate("Port", ircServer,
								XPathConstants.STRING));
			}
		}
	}
}

Gruß Tom
 
Also eine DTD habe ich schon geschrieben und wird auch auf die Gültigkeit überprüft, das hab ich hinbekommen. Dein Beispiel werde ich mir gleich mal zu Gemüte führen, dankeschön.

Code:
<!ELEMENT IRCServers (IRCNetwork)*>

<!ELEMENT IRCNetwork (IRCServer)*>
<!ATTLIST IRCNetwork name CDATA #IMPLIED>

<!ELEMENT IRCServer (Description?, Port?, Password?)>
<!ATTLIST IRCServer Server CDATA #REQUIRED>

<!ELEMENT Description (#PCDATA)>
<!ELEMENT Port (#PCDATA)>
<!ELEMENT Password (#PCDATA)>
 
So, vielen Dank für den Tip mit XPath und dem Beispiel. Habe mich diesen Nachmittag damit auseinandergesetzt und bin mit dem Ergebnis sehr zufrieden. Übrigens, diese Tutorial hat mir dabei sehr geholfen bzgl. XPath Syntax:

http://www.zvon.org/xxl/XPathTutorial/Output_ger/example1.html

Code:
        public void createServerList() {

            InputSource is = getInputSource("servers.xml");

            try {

                NodeList ircServers = null;
                XPath xPath = XPathFactory.newInstance().newXPath();
                String ircNetwork = (String) networkComboBox.getSelectedItem();

                if(ircNetwork.equals("All")) {

                    ircServers = (NodeList) xPath.evaluate("//IRCServer[string-length(normalize-space(@Server)) > 0]", is, XPathConstants.NODESET);

                } else {

                    ircServers = (NodeList) xPath.evaluate("/IRCServers/IRCNetwork[normalize-space(@name) = '" + ircNetwork + "']/IRCServer", is, XPathConstants.NODESET);
                }

                if(ircServers != null) {

                    for(int i = 0; i < ircServers.getLength(); i++) {

                        String desc = (String) xPath.evaluate("Description", ircServers.item(i), XPathConstants.STRING);
                        if(desc.trim().length() > 0) {

                            serverComboBox.addItem(desc);

                        } else {

                            String addr = (String) xPath.evaluate("normalize-space(@Server)", ircServers.item(i), XPathConstants.STRING);

                            if(addr.trim().length() > 0)
                                serverComboBox.addItem(addr);
                        }
                    }
                }
            } catch(XPathExpressionException e) {

               e.printStackTrace();
            }

            sortItems(serverComboBox);
        }
 
Zurück