java - JaxB 解码意外元素错误

标签 java xml jaxb xmlroot

我在以下 xml 文件上运行 jaxb。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<planet>
  <animal>bear</animal>
</planet>

使用以下 java 代码。

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="planet")
public class Read_Test{
    public static void main(String[] args) throws JAXBException {
        File file = new File("/home/devel/Desktop/a.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(String.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        String planet = (String) jaxbUnmarshaller.unmarshal(file);
        System.out.println(planet);
    }
}

并且不断弹出以下错误。

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"planet"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1048)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:379)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:605)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3138)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:880)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
    at adsss.test.xml.Read_Test.main(Read_Test.java:14)

但是我确实定义了 @XmlRootElement(name="planet") 元素,所以它不应该是一个意外的元素。什么可能导致意外元素错误不断弹出?

最佳答案

根据您的代码,您希望从 XML 中解码一个 String 实例。显然 String 没有在任何地方定义 planet 元素。

你想解码一个 Read_test 实例:

JAXBContext jaxbContext = JAXBContext.newInstance(Read_test.class);

您可能还想将 animal 属性添加到您的 Read_test 类,否则您将看不到存储在 XML 中的任何数据。

例如:

@XmlRootElement(name="planet")
public class Read_Test{
    @XmlElement
    private String animal;

    // Rest of your class
}

如果你想看看读到的动物是什么,打印:

System.out.println(planet.animal);

关于java - JaxB 解码意外元素错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767371/

相关文章:

java - Spring MVC Controller 方法的有效返回类型是什么?

java - 尝试将 BeaconParser 添加到 AltBeacon 库时出现异常

xml - 规范用于 JUnit XML 输出

java - LWJGL Swing 错误 - 找不到解决方案

java - 设置ArrayLists的ArrayList的初始容量

java - saxon-xpath-9.1.0.8.jar!/META-INF/services/javax.xml.xpath.XPathFactory :2: Illegal configuration-file syntax

java - 基于文件夹 "values"的 Android 本地化

java - 如何解码此 XML 文件结构

java - JAXB 编码错误

java - 如何将 xml 文档元素解码到对象属性中?