Настройка вывода XStream - PullRequest
       17

Настройка вывода XStream

2 голосов
/ 16 сентября 2010

У меня есть класс, который напоминает что-то вроде этого:

class foo {
    List<String> bar;
    ...
}

Я добавляю четыре строки в список bar:

bar.add("1");
bar.add("2");
bar.add("3");
bar.add("4");

Используя xstream, мне удалось получить вывод, который выглядит следующим образом:

<foo>
  <bar>
     <blah>1</blah>
     <blah>2</blah>
     <blah>3</blah>
     <blah>4</blah>
  </bar>
</foo>

Однако мне нужен XML, который выглядит следующим образом:

<foo>
  <bar>
     <blah id="1"/>
     <blah id="2"/>
     <blah id="3"/>
     <blah id="4"/>
     ...
  </bar>
</foo>

Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Вы можете получить желаемый результат, выполнив следующее:

1: создайте класс Blah, если только вы не хотите, чтобы все строки вели себя как атрибуты.

@XStreamAlias("blah")
public class Blah {
    @XStreamAsAttribute
    String id;

    Blah(){};

    Blah(String s) {
    this.id = s;
    }
}

2: у вашего foo есть коллекция бла

@XStreamAlias("foo")
public class Foo {
    List<Blah> bar = new ArrayList<Blah>();
} 

3: Скажите XStream обработать аннотации

XStream xstream = new XStream();
xstream.processAnnotations(Foo.class);
xstream.processAnnotations(Blah.class);
System.out.println(xstream.toXML(f));

4: это вывод:

<foo>
  <bar>
    <blah id="1"/>
    <blah id="2"/>
    <blah id="3"/>
    <blah id="4"/>
  </bar>
</foo>
0 голосов
/ 16 сентября 2010

Если это не поддерживается XStream, это можно сделать с помощью MOXy JAXB . Вам нужно будет использовать аннотацию @XmlPath:

import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Foo {
    @XmlPath("bar/blah/@id")
    List<String> bar; 
}

Вы можете создать следующий XML:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <bar>
      <blah id="1"/>
      <blah id="2"/>
      <blah id="3"/>
      <blah id="4"/>
   </bar>
</foo>

С этим демонстрационным кодом:

import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();
        foo.bar = new ArrayList<String>();
        foo.bar.add("1"); 
        foo.bar.add("2"); 
        foo.bar.add("3"); 
        foo.bar.add("4"); 

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }
}

Для получения дополнительной информации см .:

...