在解析XML时拦截Xstream

假设我有一个像这样的简单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:

  Homer Simpson  

我可以在XStream中执行此操作,如下所示:

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

好的,到目前为止一切都很好,但这是我的问题。

假设我有以下要解析的XML:

  Homer Simpson  

如何使用XStream将此XML转换为相同的 User对象?

我想要一种实现某种回调的方法,这样当XStream解析fullName字段时,我可以将字符串拆分为两个并手动设置用户对象上的名字和姓氏字段。 这可能吗?

请注意,我不是问如何将字符串拆分为两个(这是简单的部分),我想知道如何拦截XML解析,因此XStream不会尝试reflection性地在User对象上设置fullName字段(这显然不存在)。

我查看了XStream提供的转换器,但无法弄清楚如何将其用于此目的。

任何帮助,将不胜感激。

你需要一个自定义转换器:

 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