繁体   English   中英

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

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

我无法将以下XML中的answername标签的aid属性映射到Answer Class的Java字段aid

任何帮助,将不胜感激。 提前致谢。

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

正如@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
}

在您的XML中,“aid”是“answername”的属性,而不是Answer对象。 如果您不介意更改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,那么你只需要使用“aid”属性和value元素创建另一个类“answername”,而Answer将把它作为一个元素。

援助财产的设定者和吸气者没有被命名为正确。 将它们分别重命名为getAidsetAid

暂无
暂无

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

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