Avatar billede shemeri Praktikant
10. august 2005 - 02:49 Der er 12 kommentarer og
1 løsning

XML, JAVA og SAXParser!

Hi,

Jeg er ved at lave en config fil til en Java applikation hvor brugeren kan lave om på opsætning og der er data gemt i en xml fil som ser sådan ud!

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<Configuration>
  <ViewerOff>0</ViewerOff>
  <ViewerTimerOff>0</ViewerTimerOff>
</Configuration>

Jeg har brug for en java kode i SAXParser hvor man kan opdatere (Opdate method) en "value" i en xml fra en element som er sent som parameter og en (Read method) hvor man kan læse hele config filen og retunere den i en array.

Er der nogen der kan give mig en link til nogle eksampler hvor jeg kan kigge på?

tak
Avatar billede arne_v Ekspert
10. august 2005 - 08:17 #1
Umiddelbart vil jeg finde det nemmere at bruge DOM (eller JDOM) når du
skal rette i en XML fil - og den fil er vel ikke så stor at hastigheden betyder
noget ?

http://www.eksperten.dk/artikler/100
http://www.eksperten.dk/artikler/245

forklarer det mest basale omkring XML i Java
Avatar billede shemeri Praktikant
10. august 2005 - 15:34 #2
Som du kan se, jeg vil gerne have en "configuration file" hvor all opsætninger er gemt. Er det godt nok og laver den fil i xml format eller er der bedre løsning til det til Java applikationer?

:-)
Avatar billede arne_v Ekspert
10. august 2005 - 15:38 #3
Det er udmærket at lave det i XML.

Men det lyder bare for mig som om du skal kigge på DOM/JDOM og ikke på SAX.

Skal den være meget simpel så overvej at bruge en properties fil !
Avatar billede shemeri Praktikant
10. august 2005 - 19:26 #4
SAX er kun en et forslag :-)

filen er simpel hvor configuration kan hentes fra og gemmes. Den skal holde få elementer som kan ser sådan ud:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<Configuration>
  <ViewerOff>0</ViewerOff>
  <ViewerTimerOff>0</ViewerTimerOff>
  <WorkingPath>c:/</WorkingPath>
  <TempDir>c:/temp</TempDir>
  <SaveDir>c:/apps</SaveDir>
  .
  .
  .
</Configuration>
Avatar billede arne_v Ekspert
10. august 2005 - 19:31 #5
jeg ville finde en properties fil fristende !

config.properties:

ViewerOff = 0
ViewerTimerOff = 0
...

kode:

Properties p = new Properties();
p.load(new FileInputStream("config.properties"));
vo = Integer.parseInt(p.getProperty("ViewerOff"));
vto = Integer.parseInt(p.getProperty("ViewerTimerOff"));
...
Avatar billede shemeri Praktikant
10. august 2005 - 19:33 #6
Jeg tilføjer:-

SAX forslag er fordi min applikationen bruger SAX og tror at det er nemmer og brug den igen istedet for at hente en ny package i min applikation som JDOM. Hvad synes du?
Avatar billede shemeri Praktikant
10. august 2005 - 19:34 #7
Jeg skal nok prøve med properties iaften :-)
Avatar billede arne_v Ekspert
10. august 2005 - 19:38 #8
Du kan godt lave en SAX parser som parser den config fil og f.eks. gemmer
i en HashMap.

Og så lave noget kode som skriver den HashMap ud som XML fil efter du har rettet
i den.

Opdater og gem er nemmere i DOM/JDOM.

Ulempen ved dem er at de bruger meget memory, men det betydre næppe noget i
denne kontekst.
Avatar billede shemeri Praktikant
10. august 2005 - 19:43 #9
dvs. det vil være nemmest og jeg vil også spar på memory hvis jeg bruge properties?
Avatar billede arne_v Ekspert
10. august 2005 - 19:48 #10
det er min vurdering

ulempen ved properties er at de fundamentalt er 1 niveau

modsat XML hvor du kan neste tags og dermed lave mange niveauer

men din config fil ser meget lige ud af landevejen ud
Avatar billede arne_v Ekspert
10. august 2005 - 20:16 #11
her kommer et simpel eksempel

config.properties
-----------------

iv = 123
sv = abc

config.xml
----------

<config>
  <iv>123</iv>
  <sv>abc</sv>
</config>

Config.java
-----------

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Config {
    public static void main(String[] args) throws FileNotFoundException, IOException, ParserConfigurationException, SAXException {
        // properties
        Properties props = new Properties();
        props.load(new FileInputStream("C:\\config.properties"));
        System.out.println(props.getProperty("iv"));
        System.out.println(props.getProperty("sv"));
        // XML
        Map xmlinfo = new HashMap();
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MySaxParser(xmlinfo));
        xr.parse("C:\\config.xml");
        System.out.println(xmlinfo.get("iv"));
        System.out.println(xmlinfo.get("sv"));
    }
}

class MySaxParser extends DefaultHandler {
    private String key;
    private StringBuffer value = new StringBuffer();
    private Map xmlinfo;
    public MySaxParser(Map xmlinfo) {
        this.xmlinfo = xmlinfo;
    }
    public void characters(char buf[], int offset, int len) throws SAXException {
        value.append(new String(buf, offset, len));
        return;
    }
    public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
        key = rawName;
        value = new StringBuffer();
        return;
    }
    public void endElement(String namespaceURI, String localName, String rawName) throws SAXException {
        xmlinfo.put(key, value.toString());
        return;
    }
}
Avatar billede arne_v Ekspert
10. august 2005 - 20:16 #12
og et svar
Avatar billede shemeri Praktikant
16. august 2005 - 20:02 #13
Det var godt. Tak for din hjælp. :-)
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