如何修复:javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:"catalog")。预期元素是 (none)

How to fix: javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"catalog"). Expected elements are (none)

我正在尝试创建一个允许用户浏览和借阅书籍的列表视图,因此作为数据源,我想将 XML 加载并映射到内存中处理的对象中。在 spring 引导中,我是 java 和 spring 引导的新手,我得到了这个错误:

**javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"catalog"). Expected elements are (none)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:712)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:232)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:227)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:94)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1117)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:542)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:524)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3058)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:820)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:601)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:531)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:885)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:821)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:639)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:228)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:199)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:140)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:179)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:164)
at com.task1.task1.Task1Application.main(Task1Application.java:25)

**

这是我的 Book.java class:

public class Book {
private String author;

private String price;

private String genre;

private String description;

private String id;

private String title;

private String publish_date;

public Book() {}
public Book(String author, String price, String genre, String description, String id, String title, String publish_date) {
    super();
    this.author = author;
    this.price = price;
    this.genre = genre;
    this.description = description;
    this.id = id;
    this.title = title;
    this.publish_date = publish_date;
}

public String getAuthor ()
{
    return author;
}

public void setAuthor (String author)
{
    this.author = author;
}

public String getPrice ()
{
    return price;
}

public void setPrice (String price)
{
    this.price = price;
}

public String getGenre ()
{
    return genre;
}

public void setGenre (String genre)
{
    this.genre = genre;
}

public String getDescription ()
{
    return description;
}

public void setDescription (String description)
{
    this.description = description;
}

public String getId ()
{
    return id;
}

public void setId (String id)
{
    this.id = id;
}

public String getTitle ()
{
    return title;
}

@XmlElement(name = "title")
public void setTitle (String title)
{
    this.title = title;
}

public String getPublish_date ()
{
    return publish_date;
}

public void setPublish_date (String publish_date)
{
    this.publish_date = publish_date;
}}

这是我的 Catalog.java class:

public  class Catalog {

private List<Book> books;

public Catalog() {}

public Catalog(List<Book> books) {
    super();
    this.books = books;
}

@XmlElement
public List<Book> getBooks() {
    return books;
}
public void setBooks(List<Book> books) {
    this.books = books;
}}

这是我的主要文件:

    public static void main(String[] args) throws JAXBException, IOException {
    try {

        File file = new File("books.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(Catalog.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Catalog que= (Catalog) jaxbUnmarshaller.unmarshal(file);

        System.out.println("Books:");
        List<Book> list=que.getBooks();
        for(Book bk:list)
            System.out.println(bk.getId()+" "+bk.getAuthor()+"  "+bk.getTitle());

    } catch (JAXBException e) {
        e.printStackTrace();
    }

}}

我的 books.xml 文件在这里: https://pastebin.com/C8udk7Mj

请告诉我如何解决这个问题以及如何继续使用本地主机并允许借书...

我已经检查并可以确认。你需要

  • 在您的目录中添加 @XmlRootElement(name = "catalog") class 以告诉 JAXB 这可以在根目录中
  • 在 getBooks() 方法上将注释更改为 @XmlElement(name="book")(否则不匹配,请查找书籍)
  • 在 Book setId 方法上添加注释 @XmlAttribute(否则你最终会得到空 ID)

然后你的代码就可以工作了:

Books:
bk101 Gambardella, Matthew  XML Developer's Guide
bk102 Ralls, Kim  Midnight Rain
...