2015-12-10 8 views
-1

У меня есть XML, который выглядит как:XStream и разбора XML-атрибутов

<document> 
    <item name="id">some value</item> 
    <item name="first-name">some value</item> 
    <item name="last-name">some value</item> 
    <item name="address">some value</item> 
    <item name="zip">some value</item> 
</document> 

POJO:

@XStreamAlias("document") 
public class Doc{ 
    private String id; 
    private String firstName; 
    private String lastName; 
    private String address; 
    private String zip; 
} 

EDIT:

Проблема я столкнулся в том, что есть повторяющиеся <item> теги заставляя xstream генерировать исключение. Я ищу способ, чтобы вытащить id, first-name, last-name и т.д. атрибуты из item элемента

ответ

1

Вы должны изменить структуру ваших классов на основе XML при условии:

Документ:

@XStreamAlias("document") 
public class Document { 
    @XStreamConverter(value = ItemsConverter.class) 
    private Items items; 
} 

Предметы:

public class Items { 
    private String id; 
    private String firstName; 
    private String lastName; 
    private String address; 
    private String zip; 

    public void setId(String id) { 
     this.id = id; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public void setZip(String zip) { 
     this.zip = zip; 
    } 
} 

Предоставлять пользовательский преобразователь (ItemsConverter) который преобразует все теги <item> в поля в объекте Items.

Пользовательский преобразователь:

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 ItemsConverter implements Converter { 


    @Override 
    public void marshal(Object o, HierarchicalStreamWriter hierarchicalStreamWriter, MarshallingContext marshallingContext) { 
     // implement logic for marshalling to xml 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) { 
     Items items = new Items(); 
     while (hierarchicalStreamReader.hasMoreChildren()) { 
      hierarchicalStreamReader.moveDown(); 
      final String currentAttribute = hierarchicalStreamReader.getAttribute("name"); 
      if ("id".equals(currentAttribute)) { 
       items.setId(hierarchicalStreamReader.getValue()); 
      } else if ("first-name".equals(currentAttribute)) { 
       items.setFirstName(hierarchicalStreamReader.getValue()); 
      } else if ("last-name".equals(currentAttribute)) { 
       items.setLastName(hierarchicalStreamReader.getValue()); 
      } else if ("address".equals(currentAttribute)) { 
       items.setAddress(hierarchicalStreamReader.getValue()); 
      } else if ("zip".equals(currentAttribute)) { 
       items.setZip(hierarchicalStreamReader.getValue()); 
      } 
      hierarchicalStreamReader.moveUp(); 
     } 
     return items; 
    } 

    @Override 
    public boolean canConvert(Class aClass) { 
     return aClass == Items.class; 
    } 
} 

испытаний Класс:

public class XStreamTest { 

    public static void main(String[] args){ 
     XStream stream = new XStream(); 
     stream.processAnnotations(Document.class); 
     Document document = (Document)stream.fromXML(new InputStreamReader(XStreamTest.class.getResourceAsStream(<your file name>))); 
    } 
} 
+0

Я пересмотрел свой вопрос. Проблема заключается в вытягивании атрибутов из повторяющихся тегов элементов. – Dan

+0

Что происходит, когда мне нужен атрибут 'address'? Скажем, например, я не забочусь ни о чем другом о человеке, кроме их адреса. Должен ли я перебирать все 'item' и применять условную логику? – Dan

+0

Чтобы получить только конкретный атрибут без повторения всех элементов, вам нужно написать собственный конвертер для поля items. посмотрите на ответ для пользовательского конвертера – akki

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