2009-11-13 72 views
15

我想用XStream將對象序列化爲這種形式的XML。XStream:具有屬性和文本節點的節點?

<node att="value">text</node> 

節點(文本)的值是序列化的對象上的字段,以及所述ATT屬性。這可能沒有寫這個對象的轉換器?

謝謝!

回答

7

寫一個轉換器,它應該是相似的代碼片斷

class FieldDtoConvertor implements Converter { 
    @SuppressWarnings("unchecked") 
    public boolean canConvert(final Class clazz) { 
     return clazz.equals(FieldDto.class); 
    } 

    public void marshal(final Object value, 
      final HierarchicalStreamWriter writer, 
      final MarshallingContext context) { 
     final FieldDto fieldDto = (FieldDto) value; 
     writer.addAttribute(fieldDto.getAttributeName(), fieldDto.getAttributeValue());  
    } 
} 

的東西,同時使用的XStream,註冊轉換器

final XStream stream = new XStream(new DomDriver()); 
stream.registerConverter(new FieldDtoConvertor()); 
+0

是的,這看起來像我做了什麼,但我添加了一個writer.setValue(fieldDto.getText())來設置節點文本。 – subb 2009-11-13 21:32:48

+0

是Subb,它需要設置節點值,在代碼段中錯過了 – Kiru 2009-11-15 14:06:46

1

這是JAXB

@XmlRootElement 
public class Node { 

    @XmlAttribute 
    String att; 

    @XmlValue 
    String value;  

} 
容易得多
+0

查看我的博客文章比較JAXB&XStream:http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare -to-xstream.html – 2010-10-07 18:49:01

16

您可以使用預定義的Converter。

@XStreamAlias("node") 
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"text"}) 
class Node { 
    private String att; 
    private String text; 
} 

XStream Annotations Tutorial也說,對ATT屬性:

注意,沒有XStreamAsAttribute註釋是必要的。 轉換器假定它隱含。

+3

我認爲這應該是答案 – sunil 2014-11-26 06:18:35

+1

+1這對我很有效,雖然這非常不直觀。應該有一個'@ XStreamValue'註釋類似於JAXB的'@ XmlValue'註釋。 – Asaph 2015-09-16 22:55:51

0

只是做的另一種方式:

@XStreamAlias("My") 
    private static class My { 
     private String field; 
    } 

    XStream xStream = new XStream(); 
    xStream.autodetectAnnotations(true); 
    xStream.useAttributeFor(My.class, "field"); 
相關問題