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.