2011-01-07 39 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