【发布时间】: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/") - 例如。问题元素看起来像<cmn:question>。另一种方法是删除前缀cmn(使命名空间定义看起来像<question xmlns="http://data.schemas.financial.abc.com/Common/2009-09-01/">)。 -
嗨,Blaise,您提供的链接已回答的问题不可行...它正在使用 saxparser,但我只想使用 jaxb,
-
嗨,fateddy,我不能在这里更改 xml,这是我项目中的一个限制...
-
只需从
@XmlRootElement注释中删除namespace属性。 -
删除并尝试了..同样的问题