2016-06-07 5 views
0

Я пытаюсь реализовать универсальный читатель XStream для чтения моего xml. Мой XML имеет одинаковый тэг, но с идентификатором differents. Пример:XStream динамически конвертировать список

XML из URL 1 возвращается:

<rss> 
    <reg id="someClass"> 
     <ds>bla bla</ds> 
    </reg> 
</rss> 

XML из URL2 возвращений:

<rss> 
    <reg id="differentClass"> 
     <id> 1 </id> 
     <location> etc </location> 
    </reg> 
    <reg id="differentClass"> 
     <id> 2 </id> 
     <location> etc2 </location> 
    </reg> 
</rss> 

Так как вы можете видеть, они все равно пока не начинается мой рег тег, это может быть список или одно значение. Но это пока нормально. Однако, если я реализую свой класс RSS с моим объектом reg, ссылающимся на мой класс «someClass», он отлично работает, он преобразует и дает мне значения, которые я ожидаю, однако мне нужно сделать их обобщенными, вместо того, чтобы создавать N классов для одной и той же структуры Я пытался реализовать мой RSS класс таким образом:

public class RSS { 
    private List<?> reg; 
    public List<?> getReg() { 
     return reg; 
    } 
    public void setReg(List<?> reg) { 
     this.reg = reg; 
    } 
} 

мой SomeClass класс:

public class SomeClass{ 
    private String ds; 
    //getters and setters 
} 

мои differentClass:

public class DifferentClass{ 
    private String id, location; 
    //getters and setters 
} 

и пытается прочитать мой XML следующим образом для первого URL:

response = client.execute(httpPost, httpContext); 
    xstream.ignoreUnknownElements(); 
    xstream.alias("rss", RSS.class); 
    xstream.alias("reg", SomeClass.class); 
    RSS rss = (RSS) xstream.fromXML(new InputStreamReader(response.getEntity().getContent())); 
    Object user = rss.getReg(); 
    return (SomeClass) user; 

и для второго URL, вместо «SomeClass», используйте «differentClass». Но этот подход не работает, так как я получаю следующее исключение:

---- Debugging information ---- 
cause-exception  : com.thoughtworks.xstream.mapper.CannotResolveClassException 
cause-message  : ds 
class    : java.util.ArrayList 
required-type  : java.util.ArrayList 
converter-type  : com.thoughtworks.xstream.converters.collections.CollectionConverter 
path    : /rss/reg/ds 
line number   : 12 
class[1]   : br.com.test.RSS 
converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
version    : 1.4.9 
------------------------------- 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:503) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:429) 
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:281) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) 
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1230) 
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1214) 
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1085) 
    at br.com.test.Test.get(Test.java:64) 
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: ds 
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:30) 
    at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47) 
    at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) 
    at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:72) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:98) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:91) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:85) 
    at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:80) 
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) 
    ... 78 more 

Я застрял здесь, можно реализовать этот подход с использованием XStream? Если да, то как? Я могу заставить его работать без этой библиотеки (чтение тега по тегу), однако было бы проще использовать эту библиотеку в будущем.

ответ

0

В сообщении об ошибке говорится, что xstream пытается преобразовать ваш ds в ArrayList. Сообщите, что это строка:

xstream.aliasType("ds", String.class); 

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

  • Нет связанных вопросов^_^