2014-11-24 6 views
1

Я хотел бы знать, как я могу реализовать дополнительные атрибуты в XStream.Как обрабатывать дополнительный атрибут с помощью XStream

Вот XML:

<AttributeValues> 
    <AttributeValue attributeId='id01' languageId='en'>20</AttributeValue> 
    <AttributeValue attributeId='id02'>99</AttributeValue> 
    <AttributeValue attributeId='id03' languageId='en'78</AttributeValue> 
    <AttributeValue attributeId='id04' languageId='en'>14</AttributeValue> 
    <AttributeValue attributeId='id05'>9</AttributeValue> 
</AttributeValues> 

После процесса синтаксического анализа, а не элемент каждого 'AttributeValue' имеет languageId.

XStream устанавливает такие пустые значения равными 'null'. Но я хотел бы иметь его как пустую строку "".

Как это реализовать?

ответ

1

Вы можете достичь своей цели, используя пользовательский класс .

Здесь вас немного угадывает, так как вы не указали код для AttributeValues и AttributeValue класс. Я буду использовать следующие классы:

AttributeValues класс:

import com.thoughtworks.xstream.annotations.XStreamAlias; 
import com.thoughtworks.xstream.annotations.XStreamImplicit; 

import java.util.ArrayList; 
import java.util.List; 

@XStreamAlias("AttributeValues") 
public class AttributeValues 
{ 
    @XStreamImplicit(itemFieldName="AttributeValue") 
    public List<AttributeValue> Values; 

    public AttributeValues() 
    { 
     Values = new ArrayList<AttributeValue>(); 
    } 

    public void add(String id, String lg, String value) 
    { 
     AttributeValue item = new AttributeValue(); 
     item.attributeId = id; 
     item.languageId = lg; 
     item.value = value; 
     Values.add(item); 
    } 
} 

AttributeValue класс:

import com.thoughtworks.xstream.annotations.XStreamAsAttribute; 

public class AttributeValue 
{ 
    @XStreamAsAttribute 
    public String attributeId; 
    @XStreamAsAttribute 
    public String languageId; 
    public String value; 
} 

А вот AttributeValueConverter класс:

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 AttributeValueConverter implements Converter 
{ 
    public boolean canConvert(Class clazz) { 
     return AttributeValue.class == clazz; 
    } 

    public void marshal(Object object, HierarchicalStreamWriter hsw, MarshallingContext mc) { 
     AttributeValue av = (AttributeValue) object; 
     hsw.addAttribute("attributeId", av.attributeId); 
     hsw.addAttribute("languageId", av.languageId); 
     hsw.setValue(av.value); 
    } 

    public Object unmarshal(HierarchicalStreamReader hsr, UnmarshallingContext uc) { 
     AttributeValue av = new AttributeValue(); 
     av.attributeId = hsr.getAttribute("attributeId"); 
     av.languageId = hsr.getAttribute("languageId"); 
     if (av.languageId == null) av.languageId = ""; 
     av.value = hsr.getValue(); 
     return av; 
    } 

} 

Сериализация:

AttributeValues obj = new AttributeValues(); 
    obj.add("id01", "en", "20"); 

    XStream xstream = new XStream(); 
    xstream.autodetectAnnotations(true); 
    xstream.registerConverter(new AttributeValueConverter()); 
    String s = xstream.toXML(obj); 

Unserialization:

XStream xstream = new XStream(); 
    xstream.autodetectAnnotations(true); 
    xstream.registerConverter(new AttributeValueConverter()); 
    AttributeValues newobj = (AttributeValues)xstream.fromXML(s); 
+0

Хорошо, тот работал для меня. –

Смежные вопросы