【问题标题】:JAXB - Make nested child element from Java object filedJAXB - 从 Java 对象字段中创建嵌套的子元素
【发布时间】:2015-01-24 14:24:09
【问题描述】:

我正在尝试通过 JAXB 从 Java 对象生成 XML 文件。我有以下 Java 类:

@XmlRootElement
public class StudentsInfo {

    String university;
    String faculty;
    long facultyNumber;
    int degree;
    String specialty;

    public String getUniversity() {
        return university;
    }
    @XmlElement
    public void setUniversity(String university) {
        this.university = university;
    }

    public String getFaculty() {
        return faculty;
    }
    @XmlElement
    public void setFaculty(String faculty) {
        this.faculty = faculty;
    }

    public long getFacultyNumber() {
        return facultyNumber;
    }
    @XmlElement
    public void setFacultyNumber(long facultyNumber) {
        this.facultyNumber = facultyNumber;
    }

    public int getDegree() {
        return degree;
    }
    @XmlElement
    public void setDegree(int degree) {
        this.degree = degree;
    }

    public String getSpecialty() {
        return specialty;
    }
    @XmlElement
    public void setSpecialty(String specialty) {
        this.specialty = specialty;
    }
}

然后在其他类中使用 main() 方法我这样做:

StudentsInfo studentsInfo = new StudentsInfo();
        studentsInfo.setFaculty("university name");
        studentsInfo.setFaculty("faculty name");
        studentsInfo.setFacultyNumber(1234);
        studentsInfo.setDegree(1);
        studentsInfo.setSpecialty("specialty name");

        // create an XML from studentsInfo
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(StudentsInfo.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            // output pretty printed
            jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            StringWriter sw = new StringWriter();
            jaxbMarshaller.marshal(studentsInfo, sw);
            String stringXML = sw.toString();
            System.out.println(stringXML);
        } catch (JAXBException e) { e.printStackTrace(); }

所以 JAXB 生成以下 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<studentsInfo>
    <degree>1</degree>
    <faculty>faculty name</faculty>
    <facultyNumber>1234</facultyNumber>
    <specialty>specialty name</specialty>
    <university>university name</university>
</studentsInfo>

但实际上我希望它生成具有另一个层次结构的 XML - 我想从某些字段中创建嵌套的 XML 标记,例如:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<studentsInfo>
    <!-- I want to have some nested elements like these for example: -->
    <university name="university name">
        <faculty>faculty name</faculty>
        <facultyNumber>1234</facultyNumber>
        <specialty>specialty name</specialty>
    </university>

    <degree>1</degree>

</studentsInfo>

那么有没有办法做到这一点,而不必创建新的 Java 类和子类?因为真正的代码比这长得多,字段也多,我不能一开始就重写..

【问题讨论】:

    标签: java xml jaxb xml-serialization marshalling


    【解决方案1】:

    似乎我有一个解决方案,但没有使用 JAXB。如果这不是一个选项,我将删除我的答案。当您使用数据投影而不是数据绑定时,例如使用 XMLBeam(披露:我隶属于该项目),您可以像这样解耦 Java 和 XML 结构:

    public class CreateStudentsInfo {
    
    public interface StudentsInfo{
    
        @XBWrite("/studentsInfo/university/@name")
        StudentsInfo setUniversityName(String universityName);
    
        @XBWrite("/studentsInfo/university/faculty")
        StudentsInfo setFacultyName(String facultyName);
    
        @XBWrite("/studentsInfo/university/facultyNumber")
        StudentsInfo setFacultyNumber(int facultyNumber);
    
        @XBWrite("/studentsInfo/university/specialty")
        StudentsInfo setSpecialty(String specialtyName);
    
        @XBWrite("/studentsInfo/degree")
        StudentsInfo setDegree(int degree);
    }
    
    public static void main(String[] args) {        
        StudentsInfo studentsInfo = new XBProjector(Flags.TO_STRING_RENDERS_XML).projectEmptyDocument(StudentsInfo.class);
        studentsInfo.setUniversityName("university name").setFacultyName("faculty name").setFacultyNumber(1234);
        studentsInfo.setSpecialty("speciality name").setDegree(1);
        System.out.println(studentsInfo);
     }
    }
    

    这个程序打印出来:

    <studentsInfo>
      <university name="university name">
        <faculty>faculty name</faculty>
        <facultyNumber>1234</facultyNumber>
        <specialty>speciality name</specialty>
      </university>
      <degree>1</degree>
    </studentsInfo>
    

    【讨论】:

    • 感谢您的回答@Cfx。我可以使用的库没有限制,所以我可以试试你的决定。但问题是,我必须在我的项目中修改太多东西。请不要删除你的答案,它很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2022-08-05
    相关资源
    最近更新 更多