【问题标题】:Error while unmarshalling with JAXB classes usage使用 JAXB 类使用解组时出错
【发布时间】:2017-10-23 00:39:15
【问题描述】:

我已经从以下 xsd 模式生成了 JAXB 类:

    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="MeetUpData">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="SessionData">
                    <xs:complexType>
                        <xs:attribute name="Date" type="xs:string" use="required" />
                        <xs:attribute name="Quantity" type="xs:int" use="required" />
                        <xs:attribute name="Theme" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Name" type="xs:string" use="required" />
            <xs:attribute name="Location" type="xs:string" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>

现在我正在尝试解组以下 XML 文档

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MeetUpData>
    <location>3</location>
    <name>2</name>
    <sessionsData>
        <date>345</date>
        <quantity>3</quantity>
        <theme>Windows</theme>
    </sessionsData>
    <sessionsData>
        <date>3</date>
        <quantity>7</quantity>
        <theme>9</theme>
    </sessionsData>
</MeetUpData>

通过以下代码:

JAXBContext jc = JAXBContext.newInstance(MeetUp.class);
            Unmarshaller ums = jc.createUnmarshaller();
            meetUpData = (MeetUpData) ums.unmarshal(new FileInputStream("src\\com\\bases\\java\\InitialXML.xml"));
            System.out.println("Info: " + meetUpData.toString());

但是我得到了一堆错误:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"MeetUpData"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)
    ....

有什么问题?

【问题讨论】:

  • 您的 XML 与架构不匹配。例如,Location 应该是MeetUpData 元素的一个属性。在您的 XML 中,您有一个单独的 location 元素。 Name / name 也是如此。此外,在 XML 中您有一个 sessionsData 元素,而在 XSD 中它被命名为 SessionData,而且还有更多错误。确保您的 XML 与您的 XSD 匹配。

标签: java xml jaxb unmarshalling


【解决方案1】:

我不知道您的 java 类是什么样子,但是根据错误消息,您没有使用 @XMLRootElement 注释根类。

我已经使用 MeetUpData 类更改了 JAXB 的实例化,并使用 @XMLRootElement 对其进行了注释。

这里是函数来源

MeetUpData.class

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class MeetUpData implements Serializable {

    private static final long serialVersionUID = 1L;
    String location;
    String name;
    List<SessionData> sessionsData;

    public MeetUpData() {
        super();
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<SessionData> getSessionsData() {
        return sessionsData;
    }

    public void setSessionsData(List<SessionData> sessionsData) {
        this.sessionsData = sessionsData;
    }

    @Override
    public String toString() {
        return "MeetUpData [location=" + location + ", name=" + name + ", sessionData=" + sessionsData + "]";
    }

}

要解组的代码

JAXBContext jc = JAXBContext.newInstance(MeetUpData.class);
Unmarshaller ums = jc.createUnmarshaller();
MeetUpData meetUpData = (MeetUpData) ums.unmarshal(new FileInputStream(
               "src\\com\\bases\\java\\InitialXML.xml"));
System.out.println("Info: " + meetUpData.toString());

此外,您需要将 XML 中的“MeetUpData”标记更改为以小写“m”开头,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<meetUpData>
    <location>3</location>
    <name>2</name>
    <sessionsData>
        <date>345</date>
        <quantity>3</quantity>
        <theme>Windows</theme>
    </sessionsData>
    <sessionsData>
        <date>3</date>
        <quantity>7</quantity>
        <theme>9</theme>
    </sessionsData>
</meetUpData>

如果这不适合您,请提供您的课程。

【讨论】:

  • 糟糕,这里打错了,我的 xml 文档有这样一行
  • 嗯,错误是在这行代码中 JAXBContext jc = JAXBContext.newInstance(MeetUp.class);我应该使用它来代替 JAXBContext jc = JAXBContext.newInstance(MeetUpData.class);但是在那之后我又遇到了一些错误,您关于“小写字母”的建议帮助我处理了这些错误,非常感谢。
【解决方案2】:

只尝试最后两行:

meetUpData = (MeetUpData) ums.unmarshal(new FileInputStream("src\\com\\bases\\java\\InitialXML.xml"));
        System.out.println("Info: " + meetUpData.toString());

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多