2011-01-07 8 views
2

Предположим, что у меня есть простой класс Java, как это:Перехватив XSTREAM при разборе XML

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 на пользователе объект (который, очевидно, не существует).

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

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

ответ

2

Вам нужен собственный конвертер:

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

+0

Спасибо, я в конечном итоге реализации аналогичного решения с вашими помощью настраиваемого преобразователя. –