【问题标题】:Getting Unexpected Element Exception while parsing JAXB class解析 JAXB 类时出现意外的元素异常
【发布时间】:2015-02-08 13:30:56
【问题描述】:

你能帮我解决这个问题吗:

我在这里尝试解组 XML 文件并收到以下错误:

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"question"). Expected elements are <{http://data.schemas.financial.abc.com/Common/2009-09-01/}question>
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Unknown Source)

类是:

问题.java:

package JAXBTest;

import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name="question",namespace="http://data.schemas.financial.abc.com/Common/2009-09-01/")
    public class Question {  
    private int id;  
    private String questionname;  
    private List<Answer> answers;  
    public Question() {}  
    public Question(int id, String questionname, List<Answer> answers) {  
        super();  
        this.id = id;  
        this.questionname = questionname;  
        this.answers = answers;  
    }  
    @XmlAttribute  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    @XmlElement  
    public String getQuestionname() {  
        return questionname;  
    }  
    public void setQuestionname(String questionname) {  
        this.questionname = questionname;  
    }  
    @XmlElement  
    public List<Answer> getAnswers() {  
        return answers;  
    }  
    public void setAnswers(List<Answer> answers) {  
        this.answers = answers;  
    }   

}

Answer.java

package JAXBTest;

public class Answer {  
private int id;  
private String answername;  
private String postedby;  
public Answer() {}  
public Answer(int id, String answername, String postedby) {  
    super();  
    this.id = id;  
    this.answername = answername;  
    this.postedby = postedby;  
}  
public int getId() {  
    return id;  
}  
public void setId(int id) {  
    this.id = id;  
}  
public String getAnswername() {  
    return answername;  
}  
public void setAnswername(String answername) {  
    this.answername = answername;  
}  
public String getPostedby() {  
    return postedby;  
}  
public void setPostedby(String postedby) {  
    this.postedby = postedby;  
}  

}  

XmltoObject.java

package JAXBTest;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilderFactory;

public class XmltoObject {

    public static void main(String[] args) throws FileNotFoundException {  

         try {  

            File file = new File("C:\\Users\\u6026472\\Desktop\\question.xml");  
            JAXBContext jaxbContext = JAXBContext.newInstance(JAXBTest.Question.class);  

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  

      Question que= (Question) jaxbUnmarshaller.unmarshal(file);  

            System.out.println(que.getId()+" "+que.getQuestionname());  
            System.out.println("Answers:");  
            List<Answer> list=que.getAnswers();  
            for(Answer ans:list)  
              System.out.println(ans.getId()+" "+ans.getAnswername()+"  "+ans.getPostedby());  




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

        } 
}

包信息.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://data.schemas.financial.abc.com/Common/2009-09-01/")
package JAXBTest;

XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<question id="1" xmlns:cmn="http://data.schemas.financial.abc.com/Common/2009-09-01/">  
        <answers>  
            <answername>java is a programming language</answername>  
            <id>101</id>  
            <postedby>ravi</postedby>  
        </answers>  
        <answers>  
            <answername>java is a platform</answername>  
            <id>102</id>  
            <postedby>john</postedby>  
        </answers>  
        <questionname>What is java?</questionname>  
    </question>  

【问题讨论】:

  • 你要么需要正确地为 xml 元素加上声明的命名空间 (xmlns:cmn="http://data.schemas.financial.abc.com/Common/2009-09-01/") - 例如。问题元素看起来像&lt;cmn:question&gt;。另一种方法是删除前缀cmn(使命名空间定义看起来像&lt;question xmlns="http://data.schemas.financial.abc.com/Common/2009-09-01/"&gt;)。
  • 嗨,Blaise,您提供的链接已回答的问题不可行...它正在使用 saxparser,但我只想使用 jaxb,
  • 嗨,fateddy,我不能在这里更改 xml,这是我项目中的一个限制...
  • 只需从 @XmlRootElement 注释中删除 namespace 属性。
  • 删除并尝试了..同样的问题

标签: java jaxb


【解决方案1】:

根据您的映射,JAXB 期望 XML 为:

<cmn:question id="1" xmlns:cmn="http://data.schemas.financial.abc.com/Common/2009-09-01/">  
    <answers>...</answers>
</cmn:question>  

而不是您当前正在解组的内容:

<question id="1" xmlns:cmn="http://data.schemas.financial.abc.com/Common/2009-09-01/">  
    <answers>...</answers>
</question>  

您可以采取以下措施来解决此问题:

  1. 修复我在此答案中指出的 XML。
  2. @XmlRootElement 注释中删除 namespace 属性,以便您的映射与 XML 匹配。
  3. 如果您无法更改 XML 或类,那么您可以在处理 XML 时对其进行调整:
  4. 您可以让 JAXB 忽略根元素,方法是使用采用 Class 参数的解组方法之一。

【讨论】:

  • 谢谢 Blaise...如果 xml 类似于:
    abc1ccd1
    true
  • @user3640657 - 您评论中的 XML 与您问题中的 XML 有何关系?
  • 这是两个不同的 xmls..我项目中的 xml 非常大,我不能在这里发布..所以我尝试了一个简单的例子......通过创建一个带有一些命名空间的 xml..但是我的评论是我在当前项目中使用的 xml 示例,我无法修改项目中的 xml...
  • @user3640657 - 这个问题应该集中在您的简化 XML 上。看起来更大的 XML 应该是一个新问题。我不会在这里改进我​​的答案来解决它,但如果你开始一个新的问题,我会尽力帮助你。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2012-03-20
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多