XStream Сериализует класс в XML, используя поле атрибута в качестве атрибута для тега XML другого поля - PullRequest
0 голосов
/ 15 мая 2018

у меня есть этот класс

public class EventXML{
    private String name;
    private String ip;
    private Date date;
    private String dateFormat;
    private String eventName;
}

с использованием этой функции:

public String toXML(){
        String x;
        XStream xs = new XStream();
        x = xs.toXML(this);
        return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+x;
    }

я получаю этот результат:

<?xml version="1.0" encoding="UTF-8"?>
    <EventXML>
      <name>SuperFarmer</name>
      <ip>IPPPPPPP</ip>
      <myData>2018-05-15 12:48:05.343 UTC</myData>
      <dateFormat>HH:mm:ss dd/MM/yyyy</dateFormat>
      <eventName>CLICCA</eventName>
    </EventXML>

но я хотел бы XML какэто:

<?xml version="1.0" encoding="UTF-8"?>
<EventXML>
  <name>SuperFarmer</name>
  <ip>IPPPPPPP</ip>
  <myData dateFormat="HH:mm:ss dd/MM/yyyy">12:48:05 15/05/2018</myData>
  <eventName>CLICCA</eventName>
</EventXML>

Не могли бы вы дать мне несколько советов, чтобы получить мою цель?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Если вы используете Xstream 1.14.x , используйте аннотации.

EventXML объект должен выглядеть следующим образом:

public class EventXML {
    public String name;
    public String ip;

    @XStreamAlias("myData")
    public MyData myData = new MyData();

    public String eventName;

    @XStreamConverter(value=ToAttributedValueConverter.class, strings={"date"})
    public static class MyData {

        public Date date;

        @XStreamAsAttribute
        public String dateFormat;
    }
}

Mavenзависимость (в случае, если вы используете maven):

<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.10</version>
</dependency>

И ваш метод toXml должен выглядеть следующим образом (с processAnnotations):

public String toXml() {
    XStream xstream = new XStream();
    // Note the processAnnotations:
    xstream.processAnnotations(EventXML.class);
    String x = xstream.toXML(this);
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + x;
}
0 голосов
/ 15 мая 2018

Мне удалось достичь желаемого результата XML с некоторыми изменениями в классе EventXML.Я создал внутренний класс, который содержит элемент и атрибут <myData>:

public class EventXML
{
    public String name;
    public String ip;
    public MyData myData = new MyData();
    public String eventName;

    public static class MyData {
        public Date date;
        public String dateFormat;
    }
}

теперь в методе сериализации, мы сообщаем xstream, как сериализовать MyData в элемент xml, а также сообщаем xstream, как конвертироватьполя даты:

  1. ToAttributedValueConverter принимает класс (первый аргумент) и имя поля (последний аргумент), названное поле будет использоваться как значение элемента, а также все другие поля классабудет использоваться в качестве атрибутов

  2. DateConverter используется xstream для преобразования Date типизированных полей. Я дал ему dateFormat в качестве аргумента.

Вот как это выглядит:

public String toXML() {
    String x;
    XStream xs = new XStream();

    // the following tell XStream how to craete myData element:
    // the last arg is the field to be used as element value and all other fields are attributes
    xs.registerConverter(new ToAttributedValueConverter(MyData.class, xs.getMapper(), xs.getReflectionProvider(),
        xs.getConverterLookup(), "date"));
    // register date converter according to dateFormat field
    xs.registerConverter(new DateConverter(myData.dateFormat, new String[]{}));

    x = xs.toXML(this);
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+x;
}
...