Сериализация объектов Java в XML с помощью XStream - PullRequest
4 голосов
/ 29 июня 2010

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

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 ]

3 голосов
/ 29 июня 2010

Вопрос в том, действительно ли вы хотите добавить сериализованную строку 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>

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

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

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>

НТН

2 голосов
/ 29 июня 2010

Пример кода

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);
}
...