2016-06-07 15 views
0

Ich versuche, einen generischen XStream-Leser zu implementieren, um meine XML zu lesen. Meine XML haben alle denselben Tagnamen, aber mit unterschiedlichen IDs. Beispiel:XStream Liste dynamisch konvertieren

XML von URL 1 zurückkehrt:

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

XML aus URL2 zurück:

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

So wie Sie sehen können, sie sind alle gleich, bis mein reg-Tag beginnt, es kann eine Liste oder ein einzelner Wert sein. Aber das ist soweit in Ordnung. Wenn ich jedoch meine RSS-Klasse mit meinem reg-Objekt referenziere, das auf meine "someClass" -Klasse verweist, funktioniert es gut, es konvertiert und gibt mir die Werte, die ich erwarte, aber ich muss es generisch machen, anstatt N Klassen für dieselbe Struktur zu erstellen ich habe versucht, meine RSS-Klasse auf diese Weise zu implementieren:

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

meine Klasse Someclass:

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

mein differentClass:

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

und versucht, meine XML zu lesen, wie für die erste URL folgt:

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; 

und für die zweite URL, statt ‚Someclass‘ verwenden ‚differentClass‘. Aber dieser Ansatz nicht funktioniert, da ich die folgende Ausnahme erhalten:

---- 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 

ich hier bin stecken, ist es möglich, diesen Ansatz zu implementieren mit XStream? Wenn ja, wie? Ich kann es machen, ohne diese lib (Tag für Tag lesen), aber es wäre einfacher für zukünftige Verwendung dieser lib.

Antwort

0

Die Fehlermeldung besagt, dass xstream versucht, Ihre ds als ArrayList zu konvertieren. Sagen Sie Xstream, dass es ein String ist:

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