Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Read XML as Singleton


Автор: telecom 3.11.2010, 15:40
Доброго времени суток.

У меня Конфигурация базы хранится в XML.
Подскажите как написать Класс(реализовать как Singleton), который зачитывает конфигурацию из XML? 

singleton я так сделал: 
Код

import java.util.*;
import java.io.*;

public class Configuration {
    private static Configuration _instance = null;

    private Properties props = null;

    private Configuration() {
         props = new Properties();
     try {
        FileInputStream fis = new FileInputStream(
                    new File(config.xml”));
        props.load(fis);
     }
     catch (Exception e) {
        //
     }
    }

    public synchronized static Configuration getInstance() {
        if (_instance == null)
            _instance = new Configuration();
        return _instance;
    }

    public synchronized String getUrl() {
        String value = null;
        ///////////////////////////////
        return value;
    }
    public synchronized String getDriver() {
        String value = null;
        ///////////////////////////////
        return value;
    }
    public synchronized String getPass() {
        String value = null;
        ///////////////////////////////
        return value;
    }
    public synchronized String getLogin() {
        String value = null;
        ///////////////////////////////
        return value;
    }
}


Хотелось бы разобраться с getUrl() , getDriver и т.д.?????

Вот мой примерный xml: 
Код

<?xml version="1.0" encoding="Windows-1251"?>
<!-- Database configuration -->
<configuration>
<database>
    <driver>mysql</driver>
    <dataURL>localhost</dataURL>
    <userName>root</userName>
    <password>777</password>
</database>
</configuration>

Автор: _Y_ 3.11.2010, 16:19
Мне кажется, что здесь несколько независимых вопросов:

1. Как сделть Singleton. - Думаю любой ФАК подойдет. Ведь структура Singleton-а не зависит от того содержится в нем XML или нет. Впрочем, сам Singleton может имплементировать интерфейс Document, например (см п.2).

2. Как прочитать XML (и как ее потом использовать, наверное). Мне кажется, что сначала надо выбрать модель. В Java для XML имеются два основных подхода DOM и событийно-ориентированная модель. Судя по тому, что XML документ будет не очень большим - DOM наверное лучше. Смотрите интерфейсы Document, Element, Node, NodeList. Обратите внимение, что эти (или подобные) классы/интерфейсы сужествуют в разных пакетах и работают несколько по-разному (сколь я помню).

3. Разобраться с getUrl, getDriver  - подозреваю, что у Вас это просто GET методы, отдающие информацию, соержащуюся в XML файле. Когда разберетесь со структурой DOM документа, будет сразу понятно как их сделать.

Автор: garbuz 3.11.2010, 22:14
Что мешает сделать не через xml, а через properties? Гораздо удобнее и проще. Если же использование конфигурации через xml стоит как самоцель, то откройте исходники любой библиотеки, которая использует в качестве своего конфига xml файл, тот же хибернейт или спринг, найдити класс, которые этим занимается и все smile Если же хочется уж совсем все самому, то как верно сказал _Y_, смотрите в сторону dom парсеров, вроде JDom был ничего.

Автор: powerOn 4.11.2010, 01:19
Можно распарсить XML с помощью JAXB.
Код

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Configuration
{
    private Database database;

    @XmlElement
    public Database getDatabase()
    {
        return database;
    }

    public void setDatabase(Database database)
    {
        this.database = database;
    }
}


Код

import javax.xml.bind.annotation.XmlElement;

public class Database
{
    private String driver;
    private String dataUrl;
    private String userName;
    private String password;

    @XmlElement
    public String getDataUrl()
    {
        return dataUrl;
    }

    public void setDataUrl(String dataUrl)
    {
        this.dataUrl = dataUrl;
    }

    @XmlElement
    public String getDriver()
    {
        return driver;
    }

    public void setDriver(String driver)
    {
        this.driver = driver;
    }

    @XmlElement
    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    @XmlElement
    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String userName)
    {
        this.userName = userName;
    }
}


Код

import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class App 
{
    public static void main( String[] args ) throws JAXBException
    {
        // создаем модель
        Configuration configuration = new Configuration();
        Database database = new Database();

        database.setDataUrl("jdbc:derby://localhost:1527/sample");
        database.setDriver("org.apache.derby.jdbc.ClientDriver");
        database.setUserName("root");
        database.setPassword("root");
        configuration.setDatabase(database);

        // готовим контекст JAXB
        JAXBContext context = JAXBContext.newInstance(Configuration.class, Database.class);

        // создаем маршаллер
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // записываем данные в XML.
        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(configuration, stringWriter);
        System.out.println(stringWriter);

        // создаем анмаршаллер и парсим xml.
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Configuration parsedConfiguration =
                (Configuration) unmarshaller.unmarshal(new StringReader(stringWriter.toString()));

        System.out.println(parsedConfiguration.getDatabase().getDataUrl());
        System.out.println(parsedConfiguration.getDatabase().getDriver());
        System.out.println(parsedConfiguration.getDatabase().getUserName());
        System.out.println(parsedConfiguration.getDatabase().getPassword());
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)