wpisywanie i odczytywanie z XML

0

Witam,

mam pewien problem musze zapisac do pliku xml dane z HashMap, a nasepnie je odczytac i ponownie wprowadzic do HashMap. Plik XML ma byc wykorzytywany jako "baza danych".

Stworzylam w tym celu nastepujace funkcje:

public Map<String, Article> readArticle() throws Exception {
	Map<String, Article> list;
	
	FileInputStream direct = new FileInputStream("C:/temp/articleList.xml");
	XMLDecoder decoder = new XMLDecoder(direct);
	list =(Map<String, Article>) decoder.readObject();
	decoder.close();
	return list;
}


public void storeArticle(Map<String, Article> collection) throws Exception {
	
	FileOutputStream direct = new FileOutputStream("C:/temp/articleList.xml");
	XMLEncoder encoder = new XMLEncoder(direct);
	
		encoder.writeObject(collection);
	
	encoder.close();
	
}

niestety gdy wczytuje dane do HashMap tworza mi sie i wpisuja nowe obiekty z defaultowymi ustawieniami, zamiast tego co znajduje sie w pliku articleList.xml

Nie mam juz cierpliwosci do tego, zupelnie nie wiem dlaczego tak sie dzieje :) moze ktos jest w stanie mi pomoc albo podac jakis inny sposob na rozwiazanie problemu wpisywania i odczytywania danych z XML.

0

Po dokonaniu zmian u mnie działa.

    public static HashMap<String, String> readArticle() throws Exception {
            HashMap<String, String> list;
            FileInputStream direct = new FileInputStream("/tmp/articleList.xml");
            XMLDecoder decoder = new XMLDecoder(direct);
            list =(HashMap<String, String>) decoder.readObject();
            decoder.close();
            return list;
    }
0

hmmm faktycynie na stringach zachowuje sie ok.

Widocznie problem jest bardziej zlozony. Ja potrzebuje jakiejs takiej metody zapisu i odczytu, ktora umozliwialaby mi po na odczytanie mapy ( w postaci <numer artykulu:: String, artykul::Article>)z pliku w taki sposob abym pozniej miala dostep do atrybutow i funkcji obiektow klasy Article.

W tym momencie faktycznie prawidlowo zostaje odczytany klucz (czyli numer artykulu), za to sam obiekt po dczytaniu jest pusty.

Moze powinnam w jakis inny sposob zapisywac to do xml'a, tyko w jaki?

0

Mam nadzieję że nie umknęło twojej uwadze też to że zamiast posługiwać się Interfejsem MAPY w moim przykładzie
zwracam HASHMAPĘ'ę !

0

heh bez obawy nie umknelo!

Tylko, ze mimo wszystko ndala nie dziala to w prawdilowy sposob. Tak jak mowilam po wczytaniu do HashMap i probie wykonania operacji na obiektach klasy Article okazuje sie, ze ich atrybuty sa puste.

Moim celem jest stworzenie w pliku xml bazy artykulow, ktora bede mogla wcztac i obslugiwac przy kazdym uruchomieniu programu. Czyli tworze sobie artykul o okreslonej nazwie, numerze itd, zapisuje go do pliku,a potem chce miec mozliwosc wczytania go i odczytania tych atrybutow. W moim programie po wczytaniu i probie odczytania atrybutow zwracaja one wartosc null i zupelnie nie wiem dlaczego.

0

Czy Twoja klasa "Article" implementuje interfejs Serializable?
Czy masz podefiniowane setery i getery?

0

Setery i getery oczywiscie sa.
Na temat interfejsu Serializable nie wiem nic wiec Article go nie implementuje, rozumiem ze powinna?

To jest kod klasy Article:

package videostore.article;

import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;

public class Article {
	private String name;
	private String number;
	private String description;
	private int aviableArticle;
	
	
	public void printInfo(){
		System.out.println("Name= " + name);
		System.out.println("Number= "+number);
		System.out.println("Description =" + description);
		System.out.println("Aviable Article = " + aviableArticle);
	}
	
	public void setInfo() throws InputMismatchException{
		Scanner scan= new Scanner(System.in);
		
		System.out.println("Name:");
		name=scan.nextLine();
		
		System.out.println("Description:");
		description=scan.nextLine();
		
		System.out.println("How much?");
		aviableArticle=scan.nextInt();
		
	}

	public int aviableArticle(){
		
		return aviableArticle;	
	}
	
	
	void incermentArticles(int quantity){
		aviableArticle=aviableArticle+quantity;
	}
	
	public void decremntArticles(int quantity){
		aviableArticle=aviableArticle-quantity;
	}

	
	public void generateArticleNumber(String typ){
	
	Random a= new Random();
	String num=typ;	
	
	for (int j=0; j<12; j++){
		
		num=num+a.nextInt(10);	
	}
	number = num;

	}
	
	public String getNumber(){
		return number;
	}
	
	int getAviableArticles(){
		return aviableArticle;
	}
	
	public String getName(){
		return name;
	}
	
	public String adInfo(){
		return "-no info-";
	}

}

Po article dzeidzicza jeszcze inne klasy, przeciazaja one funkcje generowania numerow oraz adInfo.

0

ok problem rozwiazany :)

dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1