XML einlesen

S

stefang1989

Gast
Hallo, ich hab schon ein bisschen im Forum gesucht, jedoch werde ich aus den Threads nicht wirklich schlau.

Ich muss für mein Programmierpraktikum im 2ten Semester eine XML Datei einlesen, die Informationen über einen Graphen enthält.
Die XML ist mit der GXL erstellt und sieht etwa so aus:

[XML]
<gxl>
<graph id="id1">
<node id="id2">
<attr name="description">
<string>n1</string>
</attr>
<attr name="x">
<int>0</int>
</attr>
<attr name="y">
<int>0</int>
</attr>
</node>
</gxl>
[/XML]

Nun stellt sich mir die Frage, wie ich an die einzelnen Elemente herankomme um meinen Knoten zu erzeugen.

Ich bin bisher so weit:

Java:
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(is);

NodeList nodes = doc.getElementsByTagName("node");
NodeList edges = doc.getElementsByTagName("edge");

Da komme ich jetzt nicht weiter. Ich schaff es nicht, aus den nodes.item(i) bestimmte Werte zu extrahieren und in Variablen zu speichern.

Bin Dankbar für jeden Ratschlag.

Liebe Grüße,
Stefan
 
S

stefang1989

Gast
Tut mir leid :-/ Das hilft mir nicht wirklich weiter.

Ich bin ein ziemlicher Anfänger was Java angeht - sollte ich vielleicht noch sagen.

Ich hab schon versucht es so zu machen :

Java:
NodeList sections = document.getElementsByTagName("node");
for (int i = 0; i < sections.getLength(); i++) {
    Node knoten = sections.item(i);
    String desc = knoten.getFirstChild().getNextSibling().getTextContent().replace(" ", "").replace("\n", "");
}

Damit bekomm ich zwar speziell für meine XMLdatei die Daten. Aber das kanns ja nicht sein.

Gibts denn da nicht irgend ne einfachere Möglichkeit, die man auch als Anfänger verstehen kann?
 

Murray

Top Contributor
Etwas so (nur in den Editor gehackt, daher vermutlich nicht korrekt; das Prinzip dürfte aber klar werden):
Java:
NodeList sections = document.getElementsByTagName("node");
for (int i = 0; i < sections.getLength(); i++) {
    Element knoten = (Element)(sections.item(i));
    String id = knoten.getAttribute( "id");
    String description = null;
    int x = 0;
    int y = 0;
    NodeList attrs = knoten.getElementsByTagName("attr");
    for (int j = 0; j < attrs.getLength(); j++) {
        Element attr = (Element)(attrs.item( j));
        String name = attr.getAttribute( "name");
        if ( "description".equals( name)) {
           description = ((Element)(attr.getElementsByTagName( "string").item(0))).getTextContent();
        } else if ( "x".equals( name)) {
           x = Integer.parseInt( ((Element)(attr.getElementsByTagName( "int").item(0))).getTextContent());
        } else if ( "y".equals( name)) {
        	 y = Integer.parseInt( ((Element)(attr.getElementsByTagName( "int").item(0))).getTextContent());
        } else {
            throw new IllegalArgumentException( "attr.name=" + name);
        }
    }
}
 

dzim

Top Contributor
Gibt es denn zu diesem XML ein Schema? Also kein DTD...

Wenn nein, dann bau dir eins dazu. Eclipse z.B. bringt - entsprechend konfiguriert - einen graphischen Schema-Editor mit. Allerdings kannst du hier auch sicher aus einer Reihe von anderen freien Editoren wählen.

Wenn du dann ein Schema hast, generiere mittels des in Java enthaltenen Programs "xjc" die Mapping-Klassen dazu. Das "buzzword" hier ist JAXB.
Da findest du sicher viele einfache Beispiele im Netz.
Fakt ist, dass du dann nur ein mal das File mit der Quelle angeben musst und kannst danach einfach mittels normaler Java-Methoden über die Daten iterieren, da es intern dann konkrete Objekte, wie zum Beispiel Listen sind.
 

Noctarius

Top Contributor
Zeigt auf die Signatur :D
Einfach die beiden Tagnamen als Handler registrieren und weiterverarbeiten (brauchst nur ein XML-Schema .xsd)
 
S

stefang1989

Gast
Guten Abend bzw. Morgen :)

Der Ansatz von Murray hat mir sehr geholfen. Danke!

Jetzt kann ich hier vielleicht grade noch die nächste Frage posten:

Habe nun folgenden Code:

Java:
public N createNode(Node element) {
        Element knoten = (Element) element;
        String id = knoten.getAttribute("id");
        String description = null;
        int x = 0;
        int y = 0;
        NodeList attrs = knoten.getElementsByTagName("attr");
        for (int j = 0; j < attrs.getLength(); j++) {
            Element attr = (Element) (attrs.item(j));
            String name = attr.getAttribute("name");
            if ("description".equals(name)) {
                description = ((Element) (attr.getElementsByTagName("string").item(0))).getTextContent();
            } else if ("x".equals(name)) {
                x = Integer.parseInt(((Element) (attr.getElementsByTagName("int").item(0))).getTextContent());
            } else if ("y".equals(name)) {
                y = Integer.parseInt(((Element) (attr.getElementsByTagName("int").item(0))).getTextContent());
            } else {
                throw new IllegalArgumentException("attr.name=" + name);
            }
        }
        N node = new N(); // Hier soll ein neues Element erzeugt werden.
        node.setId(id);
        return node;
    }

An der Stelle mit dem Kommentar soll nun ein neues Object vom Typ N erzeugt werden, das anschliessend zurückgegeben wird. Nun hänge ich fest, wie ich denn ein solches Objekt zur Laufzeit erzeugen kann? Geht das denn so? Oder habe ich da einen Denkfehler drin?

Vielen Dank schonmal - und nochmal an alle die was gepostet haben, besonders Murray :) - Ich habs sogar verstanden :D

Lg, Stefan
 

Murray

Top Contributor
An der Stelle mit dem Kommentar soll nun ein neues Object vom Typ N erzeugt werden, das anschliessend zurückgegeben wird. Nun hänge ich fest, wie ich denn ein solches Objekt zur Laufzeit erzeugen kann? Geht das denn so? Oder habe ich da einen Denkfehler drin?
An der Stelle erzeugst du ja bereits eine neues Objekt vom Typ N und gibst es zurück - was ist also das Problem? Soll das neue N-Objekt neben der ID auch noch die anderen Merkmale des XML-Nodes haben? Dann können man einen passenden Konstruktor spendieren oder - wie bei der ID - entsprechende Setter aufrufen. Vielleicht postests du mal den Code von N.

Oder geht es wirklich darum, beim Parsen des XMLs neue Nodes anzulegen, wie Noctarius das beschrieben hat?
 
S

stefang1989

Gast
Guten Morgen,

An der entsprechenden Stelle soll ein Knoten in einem Graphen erstellt werden, dessen Datenstruktur ich selbst entworfen habe. Jedoch gibt es eben unterschiedliche Typen von Knoten. ( XYNode, XYZNode, ... ) Die alle jeweils unterschiedliche konstruktoren haben. Teil der Aufgabe ist es, eine allgemeingültige Lösung zu implementieren.

Hier mal beispielsweise der Konstruktor von XYNode :
Java:
/**
     * Erstellt einen neuen Knoten.
     * @param x x-Koordinate
     * @param y y-Koordinate
     * @param description Beschreibung des Knoten
     */
    public XYNode(String description, int x, int y) {
        xkoord = x;
        ykoord = y;
        desc = description;
    }

Das ganze sieht so aus:
Ich habe eine GXLSupport.java in der die methoden mit diesem N definiert werden, die XML datei eingelesen wird usw... Weiter habe ich eine XYGXLSupport die von der Klasse GXLSupport<XYNode> erbt. Über diese XYGXLSupport klasse lese ich dann mein File ein in dem XYNodes stehen.
Nun ist die Frage, ob ich in XYGXLSupport eine extra createNode methode überladen muss um einen XYNode zu erzeugen oder ob es möglich ist, der vererbenden Klasse zu sagen, welchen Typen sie erstellen soll ( sollte ja via N klappen ) und welchen Konstruktor sie verwenden soll.

Ist sowas möglich oder bin ich da auf dem falschen Weg?

Danke wiedermal :)

Stefan
 

Noctarius

Top Contributor
Dann musst du ja an irgendwas unterscheiden können (z.B. Tagname) welche Instanz erzeugt werden soll. Wenn du alle diese Klassen vom selben Interface bzw der selben Superclass ableitest kannst du per If-ElseIf-Else Konstrukt instanzieren und Daten ausgeben.
 
S

Stefang1989

Gast
Hallo,

Hab nun alles hinbekommen.
Das mit dem erstellen des Objects hatte ich nur falsch verstanden.
Habe nämlich eine abtrakte klasse, die hier von meinen Datenstrukturen erbt. Und habe aber zum einlesen und erstellen der knoten eine Typenfeste klasse gegeben.

Somit ist das Thema erledigt und kann geschlossen werden :)

Vielen dank nochmals an alle die mir geholfen haben!!

Liebe Grüße,
Stefan
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
iman XML Attribute mit JAVA einlesen mit Spring Batch XML & JSON 0
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
L XML einlesen gleichnamige Elemente XML & JSON 5
T HTML mit Hilfe Jsoup einlesen XML & JSON 11
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
W XML einlesen und Attribute auslesen XML & JSON 1
M XML Werte einlesen aber wie am besten weiterverarbeiten? XML & JSON 13
L XML nur ein Element einlesen XML & JSON 2
L Jackson JSON: Probleme beim einlesen XML & JSON 1
S XML in JTable Einlesen XML & JSON 3
B XML analysieren und einlesen XML & JSON 26
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
Ollek XML Einlesen - Welche API ist die richtige? XML & JSON 14
X XML einlesen XML & JSON 6
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
jstei001 .xsd File wärend der Laufzeit einlesen und XMl rausschreiben XML & JSON 5
J XML mit russischem Inhalt einlesen XML & JSON 4
D XML Einlesen mit JaxB XML & JSON 4
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
B Validierung nur beim einlesen oder auch beim schreiben? XML & JSON 4
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
N xsd pattern in java einlesen XML & JSON 6
F Einlesen von JDBC connection in Java von XML XML & JSON 4
J wert IN einem tag einlesen/schreiben XML & JSON 4
F XML erzeugen aus JTree und wieder einlesen... XML & JSON 6
N JDOM: XML einlesen XML & JSON 4
F XML mit DOM einlesen- Teile in Arraylist speichern XML & JSON 4
F XML Datei in Java einlesen XML & JSON 4
H XMI über EMF / UML2 einlesen XML & JSON 7
S XML einlesen, analysieren, bearbeiten & als Textdatei ausgeben XML & JSON 1
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
H xml-Datei mit Attributen einlesen XML & JSON 3
C xml "zeilenweise" einlesen XML & JSON 6
B XML einlesen und in Datenbank schreiben XML & JSON 1
S XML-Schema einlesen um parsen zu erleichtern? XML & JSON 2
L Element einlesen <Telefon name="Karl">134313 XML & JSON 2
G XML Tag beim Einlesen manipulieren XML & JSON 2
J XML-Datei ein Array einlesen XML & JSON 10
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
G Simples XML File einlesen mit JDom. Prefix not bound ? XML & JSON 2
M Liste in Baumstruktur einlesen XML & JSON 4
D nicht (ganz) valiedes XML einlesen! XML & JSON 19
S Einlesen einer xml Datei XML & JSON 4
S XML Datei einlesen, aber root überspringen XML & JSON 2
M XML einlesen - prüfen ob Element vorhanden XML & JSON 2
M NullPointerException bei Einlesen XML XML & JSON 3
J XML - schreiben und einlesen (Schema) XML & JSON 14
S XML Strings in JAVA einlesen, aber wie? XML & JSON 8
K JDOM SAXBuilder einlesen XML & JSON 6
G Newbe - Frage.XML - Datei einlesen und speichern XML & JSON 2
G xml einlesen und bestimmte Elemente an eine gui_Klasse überg XML & JSON 25
B XML String einlesen XML & JSON 4
M mit JDOM XML-Datei einlesen, die nicht "well-formed&quo XML & JSON 3
T Newbie Frage. CSS Stylesheet einlesen und suchen nach Tags XML & JSON 6
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
C Zeile herausfinden in der ein Fehler beim Einlesen entsteht XML & JSON 3
R wie kann ich ein xml file in einen string einlesen? XML & JSON 2
N Objekte via XML speichern und wieder einlesen XML & JSON 12
R POST REQUEST: XmlDocument mit getInputStream einlesen! XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben