簡體   English   中英

具有相同名稱的JAXB解組元素

[英]JAXB unmarshalling elements with same name

這是我的xml結構

<catalog>
    <course>
        <course_id></course_id>
        <subjects>
            <subject>
                <subject_id></subject_id>
            </subject>
            <subject>
                <subject_id></subject_id>
            </subject>
        </subjects>
    </course>
</catalog>

因此,我嘗試使用JAXB Unmarshalling將此xml綁定到類,但結果一無所獲。

我當時在想,我有2個基本要素,課程和主題,因此我根據這些要素構建了2個類。
這可以控制課程標簽

@XmlRootElement(name="catalog")
@XmlAccessorType(XmlAccessType.FIELD)
public class curso {
    @XmlElement(name="course_id")
    int course_id;

    @XmlElementWrapper(name="subjects")
    @XmlElement(name="subject")
    List <subject> subjects = new ArrayList<>();


    public void setCourse_id(int curso_id) {
        this.curso_id = curso_id;
    }

    public void setSubjects(List<subject> subjects) {
        this.subjects = subjects;
    }

}

並以此來控制主題標簽。

public class subject {
    String subject_id;

    @XmlElement(name="subject_id")
    public void setSubjectId(String id) {
        this.subject_id = id;
    }
}

我對字符串函數做了一些,但是我的輸出卻一無所有。 問題是什么?

course元素還具有包裝器標記<course>因此您要么需要更改xml才能刪除<catalog>標記,然后將<course>作為根。 或者,您應該創建一個新的班級目錄並將課程設置為字段。 喜歡

@XmlRootElement(name="catalog")
@XmlAccessorType(XmlAccessType.FIELD)
class catalog {
    @XmlElement(name="course")
    curso course;

    public curso getCourse() {
        return course;
    }

    public void setCourse(curso course) {
        this.course = course;
    }

    @Override
    public String toString() {
        return "catalog [course=" + course + "]";
    }
}

一個完整的例子

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="catalog")
@XmlAccessorType(XmlAccessType.FIELD)
class catalog {
    @XmlElement(name="course")
    curso course;

    public curso getCourse() {
        return course;
    }

    public void setCourse(curso course) {
        this.course = course;
    }

    @Override
    public String toString() {
        return "catalog [course=" + course + "]";
    }
}

class curso {
    @XmlElement(name = "course_id")
    int course_id;

    @XmlElementWrapper(name = "subjects")
    @XmlElement(name = "subject")
    List<subject> subjects = new ArrayList<>();

    public void setCourse_id(int curso_id) {
        this.course_id = curso_id;
    }

    public void setSubjects(List<subject> subjects) {
        this.subjects = subjects;
    }

    @Override
    public String toString() {
        return "curso [course_id=" + course_id + ", subjects=" + subjects + "]";
    }

}

class subject {
    String subject_id;

    @XmlElement(name = "subject_id")
    public void setSubjectId(String id) {
        this.subject_id = id;
    }

    @Override
    public String toString() {
        return "subject [subject_id=" + subject_id + "]";
    }
}

public class JaxbExample2 {
    public static void main(String[] args) {
        try {

            File file = new File("file.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(catalog.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            catalog customer = (catalog) jaxbUnmarshaller.unmarshal(file);
            System.out.println(customer);

        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM