XML Lesen mit unterschiedlichen Child-Nodes

00d4vid

Mitglied
Hi,

ich habe folgendes Problem:
Ich muss eine XML-Datei einlesen (und nutze dafür JDOM), die unterschiedliche Child-Nodes hat.
Z.B. also so etwas:
Code:
<rootnode>
	<child>
		<subchild></subchild>
		<subchild></subchild>
		<textlines></textlines>
	</child>
	<child>
		<subchild></subchild>
		<textlines></textlines>
	</child>
</rootnode>

Jetzt habe ich aber das Problem, dass ich nur an die Subchilds ran komme und die textlines nicht gefunden werden.
Java:
NodeList listOfConfParams = doc.getElementsByTagName("child");

for (int i = 0; i < listOfConfParams.getLength(); i++) {
	Node firstNode = listOfConfParams.item(i);

	NodeList childNodes = firstNode.getChildNodes();

	for (int y = 0; y < childNodes.getLength(); y++) {
		Node subNode = childNodes.item(y);
		if(subNode.getNodeName().equals("subchild"){
			//funktioniert
			//saving values to collection
		}else if(subNode.getNodeName().equals("textlines"){
			//funktioniert nicht
			//saving values to another collection
		}
	}
}

Er findet allerdings immer nur subchild-Nodes und keine Textlines-Nodes, obwohl diese in der XML-Datei definitiv vorhanden sind.
Dort, wo eigentlich eine textlines-Node auftauchen sollte, steht als NodeName immer #text da.

Weiß hier jemand Hilfe oder sehe ich zufällig den Wald vor lauter Bäumen nicht im Moment?
 
Zuletzt bearbeitet:
Hi,
und du bist sicher, dass du auch jdom nutzt?
Denn zum Beispiel weder in jdom 1.1.1, noch in jdom 1.0 gibt es die Klasse Node, von anderen Methoden die du nutzt ganz zu schweigen..

Naja, so funktioniert es jedenfalls in jdom:
Java:
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

public void test(){
        try {
            SAXBuilder sxbuild = new SAXBuilder();
            InputSource is = new InputSource("C:/test.xml");
            Document doc = (Document) sxbuild.build(is);
            Element root = doc.getRootElement();
            List<Element> listOfConfParams = (List<Element>) root.getChildren("child");

            for (int i = 0; i < listOfConfParams.size(); i++) {
                Element firstNode = listOfConfParams.get(i);

                List<Element> childNodes = firstNode.getChildren();

                for (int y = 0; y < childNodes.size(); y++) {
                    Element subNode = childNodes.get(y);
                    //funktioniert
                    if (subNode.getName().equals("subchild")) {
                       System.out.println("subchid gefunden");
                    } else if (subNode.getName().equals("textlines")) {
                       System.out.println("textlines gefunden");
                    }
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (JDOMException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
Hrmpf sorry...
JDOM ist falsch - manchmal sollte ich denken bevor ich schreibe...
Java:
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

An und für sich müsste es da aber doch sehr ähnlich funktionieren oder?
Falls nicht, muss ich wohl die API wechseln, da das noch öfter vorkommen wird.

Danke schonmal für die schnelle Antwort!
 
Hi,
wenn ich deinen Code zu einem lauffähigen Programm erweitere und genau die xml Daten nehme, klappt es ohne Probleme bei mir:
Java:
public class Test {

    /**
     * Konstruktor
     */
    public Test() {
        try {
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(new File("c:/test.xml"));
            NodeList listOfConfParams = doc.getElementsByTagName("child");
            for (int i = 0; i < listOfConfParams.getLength(); i++) {
                Node firstNode = listOfConfParams.item(i);
                NodeList childNodes = firstNode.getChildNodes();
                for (int y = 0; y < childNodes.getLength(); y++) {
                    Node subNode = childNodes.item(y);
                    if (subNode.getNodeName().equals("subchild")) {
                        System.out.println("subchild gefunden");
                    } else if (subNode.getNodeName().equals("textlines")) {
                        System.out.println("textlines gefunden");
                    }
                }
            }
        } catch (SAXException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static void main(String[] argv) {
        new Test();
    }
}

3 Möglichkeiten fallen mit ein.
1.: Da der Code, den du gepostet hast, nicht der ist, der auch bei dir läuft (denn zum Beispiel sind in deinem Beispiel noch Klammer Fehler vorhanden), gibt es vielleicht nocht andere Abweichungen, weshalb es bei dir nicht klappt.
2.: Nochmal die XML Datei überprüfen, dass da keine Tippfehler sind.
3.: Vielleicht ein Problem mit dem Dateiformat, obwohl ich das nicht so ganz glaube. Meine XML Datei ist jedenfalls im ANSI Format.

Grüße!
 
Zurück