2017-04-30 145 views
2

我無法將answername標記的aid屬性映射到以下XML到Java字段aidAnswer類。JAXB Unmarshalling - 將子元素的屬性映射到java對象

任何幫助,將不勝感激。提前致謝。

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<question id="1"> 
    <answers> 
     <answername aid="101">java is a programming language</answername> 
     <postedby>ravi</postedby> 
    </answers> 
    <answers> 
     <answername aid="102">java is a platform</answername> 
     <postedby>john</postedby> 
    </answers> 
    <questionname>What is java?</questionname> 
</question> 

Java類:

Question.java

package com.deere.ruleEngine.service; 

import java.util.List; 

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

@XmlRootElement 
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 com.deere.ruleEngine.service; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Answer { 
    @XmlAttribute(name="aid") 
private int aid; 
private String answername; 
private String postedby; 
public Answer() {} 
public Answer(int id, String answername, String postedby) { 
    super(); 
    this.aid = id; 
    this.answername = answername; 
    this.postedby = postedby; 
} 

public int getId() { 
    return aid; 
} 
public void setId(int id) { 
    this.aid = 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; 
} 

} 

電流輸出:

1 What is java? 
Answers: 
0 java is a programming language ravi 
0 java is a platform john 

所需的輸出:

1 What is java? 
Answers: 
101 java is a programming language ravi 
102 java is a platform john 
+1

我不知道答案,但爲「當前輸出」和「期望輸出」加上一個。我希望每個人都能寫這樣的問題。 –

+0

謝謝你們@TimurA,托馬斯和喬治· –

回答

2

正如@TimurA已經說過,Java類不符合你的XML文件的<answername>元素。 如果你想保持你的XML文件的結構,那麼你需要你的Java類適應。

在你Answer類別中刪除aid財產, 並更改answername屬性的類型:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Answer { 
    private Answername answername; 
    private String postedby; 

    // + constructors, getters, setters 
} 

Answername創建一個單獨的類:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Answername { 

    @XmlAttribute 
    private int aid; 

    @XmlValue 
    private String text; 

    // + constructors, getters, setters 
} 
0

制定者和援助財產的getter方法是不對的命名。將它們重命名爲getAidsetAid

1

在你的XML,「援助」是「answername」不應答對象的屬性。如果你不介意改變XML,那麼你所要做的就是把它向上移動一層。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<question id="1"> 
    <answers aid="101"> 
     <answername>java is a programming language</answername> 
     <postedby>ravi</postedby> 
    </answers> 
    <answers aid="102"> 
     <answername>java is a platform</answername> 
     <postedby>john</postedby> 
    </answers> 
    <questionname>What is java?</questionname> 
</question> 

如果你想保持相同的XML,那麼你只需要創建另一個類「answername」與「援助」屬性和值元素,答案將有作爲一個元素。

相關問題