2015-02-08 42 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