微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java使用XStream读取XML

我正在尝试使用XStream反序列化此XML文件,我收到此错误

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文件.我做错了什么吗?

解决方法:

你缺少作者?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。