Avatar billede jonas82 Nybegynder
29. april 2005 - 22:02 Der er 11 kommentarer og
1 løsning

Parsing af XML fil

Jeg har en xml fil bygget op efter nedenstående princip. Hvordan får jeg den parset, så jeg kan indsætte alt indholdet i en mysql database?
Jeg er ude efter et eksempel.
<INFO maerke="ford" årgang="2003">
<Biler>
  <Bil id="1">
  <type>mondeo</type>
  <ejer>Jens hansen</ejer>
  <specs hp="150" topfart="220" />
  </Bil>
  <Bil id="2">
  <type>fiesta</type>
  <ejer>Benny Sørensen</ejer>
  <specs hp="75" topfart="170" />
  </Bil>
</Biler>
<INFO>
Der skal altså hentes:
- maerke
- årgang
Og for hver bil i listen:
- id
- type
- Ejer
- hp
- Topfart

Disse skal så smides ind i en database. Database delen kan jeg godt selv finde ud af, men hvordan jeg lige looper igennem XML´en og hiver variablerne ud ved jeg ikke.
Avatar billede arne_v Ekspert
29. april 2005 - 22:17 #1
Jeg har skrevet en artikel om det http://www.eksperten.dk/artikler/100

Men jeg prøver lige at lave et DOM eksempel
Avatar billede arne_v Ekspert
29. april 2005 - 22:19 #2
package april;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class BilXml {
    public static void main(String[] args) {
        readXml("C:\\bil.xml");
    }

    private static void readXml(String filename) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File(filename));
            NodeList biler = doc.getElementsByTagName("Bil");
            for (int i = 0; i < biler.getLength(); i++) {
                NodeList bilinfo = biler.item(i).getChildNodes();
                for (int j = 0; j < bilinfo.getLength(); j++) {
                    if (bilinfo.item(j).getNodeType() == Node.ELEMENT_NODE  && bilinfo.item(j).getNodeName().equals("type")) {
                        System.out.println("type=" + bilinfo.item(j).getFirstChild().getNodeValue());
                    }
                    if (bilinfo.item(j).getNodeType() == Node.ELEMENT_NODE  && bilinfo.item(j).getNodeName().equals("ejer")) {
                        System.out.println("ejer=" + bilinfo.item(j).getFirstChild().getNodeValue());
                    }
                    if (bilinfo.item(j).getNodeType() == Node.ELEMENT_NODE  && bilinfo.item(j).getNodeName().equals("specs")) {
                        System.out.println("hp=" + bilinfo.item(j).getAttributes().getNamedItem("hp").getNodeValue());
                        System.out.println("topfart=" + bilinfo.item(j).getAttributes().getNamedItem("topfart").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
29. april 2005 - 22:20 #3
Der er iøvrigt ingen Ford Mondeo med 150 HK ...
Avatar billede jonas82 Nybegynder
29. april 2005 - 22:41 #4
Hehe det var også bare et tænkt eksempel. Der er vist også lidt fejl i den xml..

Jeg prøver lige at kigge på det.
Avatar billede arne_v Ekspert
29. april 2005 - 22:44 #5
Der manglede faktisk kun en / det afslutte INFO tag.
Avatar billede arne_v Ekspert
29. april 2005 - 22:44 #6
Der er mange alternativer:
  SAX
  JDOM
  etc.

Men læs artiklen.
Avatar billede jonas82 Nybegynder
29. april 2005 - 23:13 #7
Jeg har prøvet at tilpasse det eksempel du har skrevet, men jeg løber ind i en nullpointer exception, hvis et felt ikke er angivet.
Hvis en ejer fx ikke er angivet står der bare <ejer /> i filen. Specs står også somme tider som <specs />
Avatar billede arne_v Ekspert
29. april 2005 - 23:16 #8
så skal du have et test mere ind

bilinfo.item(j).getFirstChild() != null

og

bilinfo.item(j).getAttributes().getNamedItem("hp") != null

vil jeg næsten tro (utestet)
Avatar billede jonas82 Nybegynder
30. april 2005 - 00:01 #9
Det ser ud til at virke. Indholdet af INFO henter jeg med en ny NodeList. Er det en ok måde at gøre det på?
Avatar billede arne_v Ekspert
30. april 2005 - 00:07 #10
Jeg mener at du kan hente det med

doc.getDocumentElement()
Avatar billede jonas82 Nybegynder
30. april 2005 - 00:15 #11
Det kunne man. Det andet var heller ikke så pænt.

Mange tak for hjælpen. Lægger du et svar.
Avatar billede arne_v Ekspert
30. april 2005 - 00:18 #12
kommer her
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