2015-02-08 49 views
0

能否请你帮我解决这个:了意外元素异常在分析JAXB类

在这里,我想解组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) 

的类是:

Question.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(); 
      } 

     } 
} 

package-info.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> 
+1

您或者需要为声明的命名空间('xmlns:cmn =“http://data.schemas.financial.abc.com/Common/2009-09-01/”')正确加前缀xml元素, - 例如。问题元素看起来像“'。另一个应用是删除前缀'cmn'(这样名称空间定义看起来像'') 。 – fateddy 2015-02-08 13:37:33

+0

嗨布莱斯,已被回答的问题,你已经提供的链接是不可行的......它使用的是saxparser,但我只想使用jaxb, – user3640657 2015-02-08 15:39:52

+0

嗨,fatedy,我不能改变这里的xml其限制在我的project ... – user3640657 2015-02-08 15:46:23

回答

0

根据您的映射,JAXB期待的XML来成为:

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

而不是你正在解组:

​​3210

以下是事情可以做,来解决这个问题:

  1. 修正XML,因为我在这个答案已经指出。
  2. @XmlRootElement注释中删除namespace属性,以使您的映射与XML匹配。
  3. 如果你不能改变XML或类,那么他们的事情可以做,以调整XML为你处理它:
  4. 你可以有JAXB忽略根元素通过使用采用Class参数的解组方法之一。
+0

谢谢布莱斯...你能给我如果xml是这样的一些想法: \t ; ABC1 CCD1 true user3640657 2015-02-09 05:15:49

+0

@ user3640657 - 评论中的XML如何与您的问题中的XML相关? – 2015-02-09 10:56:39

+0

这些是两个不同的xml ..在我的项目中的xml是相当巨大的,我不能在这里发布..因此,我尝试了一个简单的例子...通过创建一个xml与一些命名空间..但我的评论是一个样本我在当前项目中使用它的xml,我无法修改我的项目中存在的xml ... – user3640657 2015-02-09 11:47:30