2011-01-07 43 views
2

假设我有一个简单的Java类是这样的:拦截西河在解析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

谢谢,我结束了使用自定义转换器实现类似的解决方案,以你的。 – 2011-02-04 10:59:27