Перехват Xstream при разборе XML - PullRequest
2 голосов
/ 07 января 2011

Предположим, у меня есть простой Java-класс, подобный этому:

public class User {

    String firstName;
    String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

Теперь, предположим, я хочу проанализировать следующий XML:

<user>
    <firstName>Homer</firstName>
    <lastName>Simpson</lastName>
</user>

Я могу сделать это без проблем вXStream примерно так:

User homer = (User) xstream.fromXML(xml);

Хорошо, пока все хорошо, но вот моя проблема.

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

<user>
    <fullName>Homer Simpson</fullName>
</user>

Как я могу преобразовать этот XML в тот же Пользовательский объект, используя XStream?

Мне нужен способ реализовать какой-нибудь обратный вызов, чтобы, когда XStream анализировал поле fullName, я мог разделить строку на две части и вручную установить поля имени и фамилии в пользовательском объекте.Возможно ли это?

Обратите внимание, что я не спрашиваю, как разбить строку на две части (это самая простая часть), я хочу знать, как перехватить синтаксический анализ XML, чтобы XStream не пытался отражательно установитьполе fullName объекта User (которого, очевидно, не существует).

Я посмотрел на преобразователи, которые предоставляет XStream, но не смог понять, как его использовать для этой цели.

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 04 февраля 2011

Вам нужен специальный конвертер:

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class UserConverter implements Converter
{

    @Override
    public boolean canConvert(Class clazz) {
        return clazz.equals(User.class);
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) 
    {

    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) 
    {
        User user = new User();

        reader.moveDown();
        if ("fullName".equals(reader.getNodeName()))
        {
            String[] name = reader.getValue().split("\\s");
            user.setFirstName(name[0]);
            user.setLastName(name[1]);
        }
        reader.moveUp();

        return user;
    }
}

Ссылка: http://x -stream.github.io / converter-tutorial.html

...