2011-09-30 51 views
1

我正試圖找到一個解決方案,使用XStream將映射轉換爲根元素屬性。Xstream隱式映射作爲根元素的屬性

我不認爲這是可能的,但這是我試過的。

我創建了一個自定義轉換器並將其附加到根對象,然後在轉換器中,我可以訪問我試圖轉換爲屬性的映射,我遍歷映射並將attirbute寫入節點,使用writer.addAttribute(entry.getKey(),entry.getValue());這確實將屬性寫入根節點,例如

這種方法的問題是,它不處理文檔的其餘部分,它只是處理地圖後停止,爲了得到這個工作,我需要讓默認轉換器後面的一些方法在控制和完成模型。

我一直在嘗試使用的第二種解決方案是創建一個自定義轉換器,僅用於映射其自身,這種方法的問題是我無法獲取根元素的句柄,因此我無法寫入它,是否有可能以這種方式訪問​​根元素?

感謝, 喬恩

回答

1

創建寫出地圖上,倒在使用反射器編組對象轉換器:

static class MyConverter implements Converter { 

    private final Map<String, String> attributes; 

    private final Class<?> clazz; 

    private final Mapper mapper; 

    private final ReflectionProvider reflectionProvider; 

    public MyConverter(Mapper mapper, 
      ReflectionProvider reflectionProvider, Class<?> clazz, 
      Map<String, String> attributes) { 
     super(); 
     this.mapper = mapper; 
     this.reflectionProvider = reflectionProvider; 
     this.attributes = attributes; 
     this.clazz = clazz; 
    } 

    @Override 
    public boolean canConvert(Class cls) { 
     return cls == clazz; 
    } 

    @Override 
    public void marshal(Object value, HierarchicalStreamWriter writer, 
      MarshallingContext context) { 
     for (String key : attributes.keySet()) { 
      writer.addAttribute(key, attributes.get(key)); 
     } 

     Converter converter = new ReflectionConverter(mapper, 
       reflectionProvider); 
     context.convertAnother(p, converter); 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader arg0, 
      UnmarshallingContext arg1) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

從XStream的實例檢索映射和ReflectionProvider情況下,並註冊一個轉換器所有必要的設置:

XStream xs = new XStream(new DomDriver()); 
    Mapper mapper = xs.getMapper(); 
    ReflectionProvider reflectionProvider = xs.getReflectionProvider(); 
    xs.alias("youralias", YourRoot.class); 
    xs.registerConverter(new MyConverter(mapper, reflectionProvider, 
      YourRoot.class, map)); 

    System.out.println(xs.toXML(yourRoot)); 
+1

是否有可能從註釋中檢索XStream實例? –

+0

嗨,請你說明一下'unmarshal()'方法的實現嗎?我遇到同樣的問題,我相信這會有很大的幫助。 (也許你可以檢查http://stackoverflow.com/questions/17086757/how-to-unmarshal-map-using-xstream) – carlspring

+0

context.convertAnother(p,converter);什麼是「p」? –