Avatar billede cromwell Nybegynder
20. oktober 2004 - 15:47 Der er 10 kommentarer og
1 løsning

Læs data fra et XML dokument

Hej jeg har følgende XML dokument:

<?xml version="1.0"?>
<enigma>
    <stecker>
    <text>"en streng"</text>
    </stecker>
   
    <reflector>
    <text>"en streng"</text>
    </reflector>

    <rotor>
    <text>"en streng"</text>
    <notch>"en streng"</notch>
    <ring>"int"</ring>
    <pos>"int"</pos>
    </rotor>

    <alphabet>
        <text>"en streng"</text>
    <int>"int"</int>
    </alphabet>
</enigma>

Hvordan går jeg ind i rotor og henter de data der står derinde og gemmer dem i variabler?. Jeg skal altså efter kaldet have 4 variabler med indholdet af <text>"en streng"</text>, <notch>"en streng"</notch>, <ring>"int"</ring> og <pos>"int"</pos>

Det skal siges at mit XML dokument godt kan indeholde flere rotor tags.

Jeg har læst en del om XML og java her på siden, og det ser ud til at det ikke kan gøres simpelt og i få linier kode, men håber på at i kan vise mig hvordan man gør det forholdsvist simpelt.
Avatar billede arne_v Ekspert
20. oktober 2004 - 15:56 #1
Program:


import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Enigma {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("C:\\enigma.xml"));
            NodeList elements = doc.getElementsByTagName("rotor");
            for (int i = 0; i < elements.getLength(); i++) {
                Node element = (Element) elements.item(i);
                NodeList elements2 = element.getChildNodes();
                for(int j = 0; j < elements2.getLength(); j++) {
                    if(elements2.item(j).getNodeType() == Node.ELEMENT_NODE) {
                        Node element2 = (Element) elements2.item(j);
                        System.out.println(element2.getNodeName() + " = " + element2.getFirstChild().getNodeValue());
                    }
                }
            }
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
}
Avatar billede arne_v Ekspert
20. oktober 2004 - 15:56 #2
Output:

text = "en streng"
notch = "en streng"
ring = "int"
pos = "int"
Avatar billede arne_v Ekspert
20. oktober 2004 - 15:57 #3
Den finder ihvertfald data. Jeg ved ikke helt hvordan du vil have data returneret.
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:00 #4
Måske er det her en god "servering".

Program:

import java.util.Map;
import java.util.HashMap;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Enigma {
    public static void process(Map m) {
        System.out.println(m);
    }
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("C:\\enigma.xml"));
            NodeList elements = doc.getElementsByTagName("rotor");
            for (int i = 0; i < elements.getLength(); i++) {
                Node element = (Element) elements.item(i);
                Map m = new HashMap();
                NodeList elements2 = element.getChildNodes();
                for(int j = 0; j < elements2.getLength(); j++) {
                    if(elements2.item(j).getNodeType() == Node.ELEMENT_NODE) {
                        Node element2 = (Element) elements2.item(j);
                        m.put(element2.getNodeName(), element2.getFirstChild().getNodeValue());
                    }
                }
                process(m);
            }
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
}

Output:

{ring="int", text="en streng", notch="en streng", pos="int"}

Fordi så kan process fiske oplysningerne ud af mappen efter behov.
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:00 #5
Og et svar
Avatar billede cromwell Nybegynder
20. oktober 2004 - 16:10 #6
Hvorfor kommer outputtet i en "random" rækkefølge {ring="int", text="en streng", notch="en streng", pos="int"}? er det noget med hashmap?

PS. tak for svarene indtil videre:D
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:13 #7
Ja. De ligger sorteret egter keyenes hash værdi.

Men de kan jo hives ud på navn.

String text = (String)m.get("text");

så vil text indeholder "en streng". Og på den måde er rækkefølgen "ligegyldig".
Avatar billede cromwell Nybegynder
20. oktober 2004 - 16:20 #8
Jeg har prøvet at flytte koden over i en ny metode, der returnerer dette hashmap m. Jeg kalder denne funktion i main, men når jeg kører process(m); (har kaldt den det samme) så er den sidste "rotor" der bliver udskrevet, men hvis jeg kører process(m); inde i funktionen, så er det alle "rotorer" der bliver udskrevet
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:23 #9
Ja - det er meget vigtigt at process blivcer kaldt inden i den yderste for løkke.
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:28 #10
Men jeg laver lige et andet eksempel som samler alle op.
Avatar billede arne_v Ekspert
20. oktober 2004 - 16:32 #11
import java.util.List;
import java.util.ArrayList;
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Enigma2 {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File("C:\\enigma.xml"));
            List lst = new ArrayList();
            NodeList elements = doc.getElementsByTagName("rotor");
            for (int i = 0; i < elements.getLength(); i++) {
                Node element = (Element) elements.item(i);
                Rotor r = new Rotor();
                NodeList elements2 = element.getChildNodes();
                for(int j = 0; j < elements2.getLength(); j++) {
                    if(elements2.item(j).getNodeType() == Node.ELEMENT_NODE) {
                        Node element2 = (Element) elements2.item(j);
                        String key = element2.getNodeName();
                        String val = element2.getFirstChild().getNodeValue();
                        if(key.equals("text")) {
                            r.setText(val);
                        } else if(key.equals("notch")) {
                            r.setNotch(val);
                        } else if(key.equals("ring")) {
                            r.setRing(val);
                        } else if(key.equals("pos")) {
                            r.setPos(val);
                        }
                    }
                }
                lst.add(r);
            }
            System.out.println(lst);
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
}

class Rotor {
    private String ring;
    private String text;
    private String notch;
    private String pos;
    public String getNotch() {
        return notch;
    }
    public void setNotch(String notch) {
        this.notch = notch;
    }
    public String getPos() {
        return pos;
    }
    public void setPos(String pos) {
        this.pos = pos;
    }
    public String getRing() {
        return ring;
    }
    public void setRing(String ring) {
        this.ring = ring;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public String toString() {
        return (text + " " + notch + " " + ring + " " + pos);
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester