简体   繁体   English

JAXB Unmarshalling - 将子元素的属性映射到java对象

[英]JAXB Unmarshalling - Map attributes of child elements to java object

I am unable to map aid attribute of answername tag in the following XML to Java field aid of Answer Class. 我无法将以下XML中的answername标签的aid属性映射到Answer Class的Java字段aid

Any help would be appreciated. 任何帮助,将不胜感激。 Thanks in advance. 提前致谢。

XML: 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 Classes: Java类:

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 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;  
}  

}  

Current Output: 电流输出:

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

Desired Output: 期望的输出:

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

As @TimurA already said, your Java classes don't match the <answername> elements of your XML files. 正如@TimurA所说,您的Java类与XML文件的<answername>元素不匹配。 If you want to keep the structure of your XML files, then you need to adapt your Java classes. 如果要保留XML文件的结构,则需要调整Java类。

In your Answer class remove the aid property, and change the type of the answername property: 在您的Answer类中删除aid属性,并更改answername属性的类型:

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

    // + constructors, getters, setters
}

Create a separate class for Answername : Answername创建一个单独的类:

@XmlAccessorType(XmlAccessType.FIELD)
public class Answername {

    @XmlAttribute
    private int aid;

    @XmlValue
    private String text;

    // + constructors, getters, setters
}

In your XML, "aid" is an attribute of "answername" not the Answer object. 在您的XML中,“aid”是“answername”的属性,而不是Answer对象。 If you don't mind changing the XML then all you have to do is move it up one level. 如果您不介意更改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>

If you do want to keep the same XML, then you just have to create another class "answername" with the "aid" attribute and the value element, and Answer will have that as an element. 如果你想保持相同的XML,那么你只需要使用“aid”属性和value元素创建另一个类“answername”,而Answer将把它作为一个元素。

Setters and getters of the aid property are not named right. 援助财产的设定者和吸气者没有被命名为正确。 Rename them to getAid and setAid respectively. 将它们分别重命名为getAidsetAid

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM