2013-08-17 52 views
2

我試圖使用XStream的反序列化這個XML文件,我得到這個錯誤的Java讀取XML使用XStream

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 

有了這個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> 

這些類

//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); 

我從讀取XML文件重新創建類,並且更改XML文件不是一個選項。我在做一些完全錯誤的事情嗎?

+0

我不認爲你的最後一行是正確的,沒有變量名稱。 – jn1kk

+0

解決了,檢查我的第二個編輯。 – jn1kk

回答

6

您缺少作者?

//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; 
} 

編輯2:

您需要使用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; 
} 
+0

你是對的我失蹤了作者。然後它移動到名稱元素上並具有相同的錯誤。 'com.thoughtworks.xstream.converters.ConversionException:Name:Name'我覺得我不完全理解我應該如何設置類。 – user2686811

+0

嘗試別名自定義類,請檢查以下鏈接:http://xstream.codehaus.org/tutorial.html另請嘗試使用小寫變量名稱。 – jn1kk

+0

創建類'名稱'修復和下一個元素'Url'相同。當元素應該是父元素的一部分時,我無法爲每個不同的元素創建一個新類。 – user2686811