2010-06-29 3 views
4

Проблема в том, что каждый раз, когда я выполняю основной метод, старый контент a.xml теряется и заменяется новым. Как добавить содержимое в файл a.xml без потери предыдущей информации?Сериализация объектов Java в XML с помощью XStream

import java.io.FileNotFoundException; 
import java.io.PrintWriter; 

import com.thoughtworks.xstream.XStream; 
import com.thoughtworks.xstream.io.xml.DomDriver; 


public class Test { 
    public static void main(String[] args) throws FileNotFoundException { 
     XStream xs = new XStream(new DomDriver()); 
     Foo f = new Foo(1, "booo", new Bar(42)); 
     PrintWriter pw = new PrintWriter("a.xml"); 
     xs.toXML(f,pw); 
    } 
} 


public class Bar { 
    public int id; 

    public Bar(int id) { 
     this.id = id; 
    } 

} 


public class Foo { 
    public int a; 
    public String b; 
    public Bar boo; 
    public Foo(int a, String b, Bar c) { 
     this.a = a; 
     this.b = b; 
     this.boo = c; 
    } 
} 

ответ

2

Пример кода

public static void main(String a[]){ 
    //Other code omitted 
    FileOutputStream fos = new FileOutputStream("c:\\yourfile",true); //true specifies append 
    Foo f = new Foo(1, "booo", new Bar(42)); 
    xs.toXML(f,fos); 
} 
+0

Спасибо большое :) –

3

Вопрос заключается в том, действительно ли вы хотите добавить сериализованную строку XML в файл или вы хотите, чтобы добавить новый экземпляр Foo в структуре XML.

прилагая на основе строки приведет к недопустимой XML примерно так:

<foo> 
    <a>1</a> 
    <b>booo</b> 
    <bar> 
    <id>42</id> 
    </bar> 
</foo> 
<foo> 
    <a>1</a> 
    <b>booo</b> 
    <bar> 
    <id>42</id> 
    </bar> 
</foo> 

Вместо этого, вы можете сохранить данные в a.xml, анализируя его, а затем добавить новый элемент и сериализации целая коллекция/массив.

Так что-то вроде этого (предполагая, что уже есть коллекция Foo с в a.xml):

List foos = xs.fromXml(...); 
foos.add(new Foo(1, "booo", new Bar(42))); 
xs.toXml(foos, pw); 

... который дает вам что-то вдоль линий этого:

<foos> 
    <foo> 
    <a>1</a> 
    <b>booo</b> 
    <bar> 
     <id>42</id> 
    </bar> 
    </foo> 
    <foo> 
    <a>1</a> 
    <b>booo</b> 
    <bar> 
     <id>42</id> 
    </bar> 
    </foo> 
</foos> 

HTH

+0

Да, это именно то, что я хочу сделать. Но что, если файл пуст? Тогда List foos = xs.fromXML (...) не будет действителен:? –

+0

Вам придется обрабатывать некоторые особые случаи, это правда. Но в зависимости от XStream вы либо получите исключение, либо null, которое затем вы можете поймать или проверить и продолжить оттуда. –

+0

Спасибо, Мартин :) –

Смежные вопросы