Java Reading XML with XStream
16,429
You are missing Authors?
//ListOfDBook.java
public class ListOfDBook {
public ArrayList<DBook> DBook;
}
//DBook.java
public class DBook {
public ArrayList<Author> Authors;
}
//Author.java
public class Author {
public ArrayList<DAuthor> DAuthors;
}
//DAuthor.java
public class DAuthor {
String Name;
String Url;
}
EDIT 2:
You need to use addImplicitCollection
.
import java.util.*;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.*;
import com.thoughtworks.xstream.io.xml.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception {
XStream xstream = new XStream(new DomDriver());
xstream.alias("ListOfDBook", ListOfDBook.class);
xstream.alias("DBook", DBook.class);
xstream.alias("Authors", Authors.class);
xstream.alias("DAuthor", DAuthor.class);
xstream.addImplicitCollection(Authors.class, "dauthors");
xstream.addImplicitCollection(DBook.class, "authors");
xstream.addImplicitCollection(ListOfDBook.class, "dbooks");
InputStream in = new FileInputStream("Books.xml");
ListOfDBook var = (ListOfDBook)xstream.fromXML(in);
}
}
//ListOfDBook.java
class ListOfDBook {
public List<DBook> dbooks = new LinkedList<DBook>();
}
//DBook.java
class DBook {
public List<Authors> authors = new LinkedList<Authors>();
}
//Authors.java
class Authors {
public List<DAuthor> dauthors = new LinkedList<DAuthor>();
}
//DAuthor.java
class DAuthor {
public String Name;
public String Url;
}
Author by
user2686811
Updated on June 04, 2022Comments
-
user2686811 almost 2 years
I'm trying to deserialize this XML file using XStream and I'm getting this error
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: Authors : Authors ---- Debugging information ---- message : Authors cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException cause-message : Authors class : java.util.ArrayList required-type : java.util.ArrayList converter-type : com.thoughtworks.xstream.converters.collections.CollectionConverter path : /ListOfDBook/DBook/Authors class[1] : com.test.books.ListOfDBook converter-type[1] : com.thoughtworks.xstream.converters.reflection.ReflectionConverter version : null ------------------------------- at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79) at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:355) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:306) at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:234) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:65) 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:1058) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1042) at com.thoughtworks.xstream.XStream.fromXML(XStream.java:922) at com.test.booktest.BookImport.getBooks(BookImport.java:34) at com.test.booktest.Client.main(Client.java:6) Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: Authors at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:56) 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.CachingMapper.realClass(CachingMapper.java:45) at com.thoughtworks.xstream.core.util.HierarchicalStreams.readClassType(HierarchicalStreams.java:29) at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:70) at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:79) at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:72) at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:66) at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:61) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72) ... 16 more
With this XML
<ListOfDBook xmlns="Test.Books" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <DBook> <Authors> <DAuthor> <Name>Google</Name> <Url>http://google.com</Url> </DAuthor> </Authors> </DBook> </ListOfDBook>
With these classes
//ListOfDBook.java public class ListOfDBook { public ArrayList<DBook> DBook; } //DBook.java public class DBook { public ArrayList<DAuthor> Authors; } //DAuthor.java public class DAuthor { String Name; String Url; } //BookImport.java import com.test.books.*; XStream xstream = new XStream(new DomDriver()); xstream.alias("ListOfDBook", ListOfDBook.class); InputStream in = new FileInputStream("Books.xml"); ListOfDBook = (ListOfDBook)xstream.fromXML(in);
I recreated the classes from reading the XML file and changing the XML file is not an option. Am I doing something completely wrong?
-
user2686811 over 10 yearsYou are correct I was missing Author. It then moves onto the Name element and have the same error.
com.thoughtworks.xstream.converters.ConversionException: Name : Name
I feel like I don't completely understand how I should be setting out the classes. -
jn1kk over 10 yearsTry aliasing the custom classes, check this link: xstream.codehaus.org/tutorial.html Also, try lowercase variable names.
-
user2686811 over 10 yearsCreating the Class 'Name' fixes that and the same happens for the next element, 'Url'. I can't be making a new class for every different element when the element should be part of the parent element right?
-
jn1kk over 10 yearsNo You do not need a custom class for the Strings. Try using lowercase variable names first.
-
user2686811 over 10 yearsSame error with lowercase. Tried adding this to DAuthor class
public DAuthor(String Name, String URL) { this.name = Name; this.url = URL; }
also did nothing. -
user2686811 over 10 yearsIf I set
xstream.alias("Name", DAuthor.class);
it works. Is this correct? Do I need to set an alias for each variable? EDIT: I don't think that's right though, even if I set the alias to point toArrayOfDBook
it accepts it even though there is no Name variable in that class. -
user2686811 over 10 yearsThanks! That seems to have fixed it. I guess I need to do that for all the Lists of custom objects. Thanks a lot for your time