首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jaxb的嵌套xml解组

使用jaxb的嵌套xml解组
EN

Stack Overflow用户
提问于 2021-08-18 12:09:45
回答 1查看 43关注 0票数 0

我有一个如下的xml结构:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<school>
    <students>
        <student>
            <firstName>A</firstName>
            <id>1</id>
            <lastName>C</lastName>
            <company>BCD</company>
            <responsibilities>
                <responsibility>Leader</responsibility>
                <responsibility>Dancer</responsibility>
                <responsibility>Reporter</responsibility>
            </responsibilities>
        </student>
        <student>
            <firstName>B</firstName>
            <id>2</id>
            <lastName>C</lastName>
            <company>EFG</company>
            <responsibilities>
                <responsibility>Singer</responsibility>
            </responsibilities>
        </student>
    </students>
    <Teachers>
        <Teacher>
            <firstName>A</firstName>
            <lastName>C</lastName>
            <responsibilities>
                <responsibility>English</responsibility>
                <responsibility>Hindi</responsibility>
                <responsibility>Softskills</responsibility>
            </responsibilities>
        </Teacher>
        <Teacher>
            <firstName>A</firstName>
            <lastName>C</lastName>
            <company>BCD</company>
            <responsibilities>
                <responsibility>Science</responsibility>
                <responsibility>Math</responsibility>
            </responsibilities>
        </Teacher>
    </Teachers>
</school>

我希望动态解析所有对象,并将其放入列表中。我为学校,学生,学生,老师,责任,责任创建了课程。

如下所示:

代码语言:javascript
复制
import lombok.Data;
@Data
@XmlRootElement(name="school")
public class School {

    private List<Students> Students;
    private List<Teachers> Teachers;
}
代码语言:javascript
复制
@Data
public class Students {
    private List<Student> student;
}
代码语言:javascript
复制
@Data
public class Student {  
    private long Id;    
    private String firstName;   
    private String lastName;    
    private String company; 
    private Responsibilities Responsibilities;
}
代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.PROPERTY)

public class Responsibilities { 
    public List<String> responsibility ;    
}
代码语言:javascript
复制
public class Responsibility {
    private String responsibility;
}
代码语言:javascript
复制
@Data
public class Teachers {

    private List<Teacher> teacher;
}
代码语言:javascript
复制
public class Teacher {
    private String firstName;   
    private String lastName;
    private String company; 
    private Responsibilities Responsibilities;
}

我还有一个主要的解析文件,我想在这个文件中通过根标签(学校)传递所有对象。

代码语言:javascript
复制
public class ParsingXML {

    public static void main(String[] args) {
        // TODO Auto-generated method stub      
        
        List<School> Entries = new ArrayList<School>();
        try {
            File xmlFile = new File("Student.xml");
            JAXBContext jaxbContext;
            jaxbContext = JAXBContext.newInstance(School.class);                         
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();        
            School entries = (School) jaxbUnmarshaller.unmarshal(xmlFile);  
            Entries.add(entries);
            
            /*
             * for(Student s: students.getStudent()) { System.out.println(s); }
             */
               
        }
        catch (JAXBException e) 
        {
            e.printStackTrace();
        }               
        ListIterator<School> litr = Entries.listIterator();   
        System.out.println(Entries.size());
        //System.out.println("\n Using list iterator");
        while(litr.hasNext()){
            System.out.println(litr.next());
        }
    }

}

我也希望得到教师的参赛作品。但我这里只有学生。输出:

代码语言:javascript
复制
School(Students=[Students(student=[Student(Id=1, firstName=A, lastName=C, company=BCD, Responsibilities=Responsibilities(responsibility=[Leader, Dancer, Reporter])), Student(Id=2, firstName=B, lastName=C, company=EFG, Responsibilities=Responsibilities(responsibility=[Singer]))])], Teachers=null)

请告诉我我的错误,并在这里给我一些指导

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-18 14:18:23

下面的代码将为您工作:

School.class

代码语言:javascript
复制
@XmlRootElement(name = "school")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class School {

    @XmlElementWrapper(name="students")
    @XmlElement(name="student")
    private List<Student> students;

    @XmlElementWrapper(name="Teachers")
    @XmlElement(name="Teacher")
    private List<Teacher> responsibilities;
}

Teacher.class:

代码语言:javascript
复制
@Data
@XmlAccessorType(XmlAccessType.NONE)
public class Teacher {

    @XmlElement(name="firstName")
    private String firstName;

    @XmlElement(name="lastName")
    private String lastName;

    @XmlElementWrapper(name="responsibilities")
    @XmlElement(name="responsibility")
    private List<String> responsibilities;
}

Student.class:

代码语言:javascript
复制
@Data
@XmlAccessorType(XmlAccessType.NONE)
public class Student {
    @XmlElement(name="id")
    private long Id;

    @XmlElement(name="firstName")
    private String firstName;

    @XmlElement(name="lastName")
    private String lastName;

    @XmlElement(name="company")
    private String company;

    @XmlElementWrapper(name="responsibilities")
    @XmlElement(name="responsibility")
    private List<String> responsibilities;
}

Main.class:

代码语言:javascript
复制
public class Main {
    public static void main(String[] args) throws JAXBException, XMLStreamException {
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("students.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(School.class).createUnmarshaller();
        final School school = unmarshaller.unmarshal(xmlStreamReader, School.class).getValue();
        System.out.println(school.toString());

        Marshaller marshaller = JAXBContext.newInstance(School.class).createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(school, System.out);
    }
}

以下是输出:

代码语言:javascript
复制
School(students=[Student(Id=1, firstName=A, lastName=C, company=BCD, responsibilities=[Leader, Dancer, Reporter]), Student(Id=2, firstName=B, lastName=C, company=EFG, responsibilities=[Singer])], responsibilities=[Teacher(firstName=A, lastName=C, responsibilities=[English, Hindi, Softskills]), Teacher(firstName=A, lastName=C, responsibilities=[Science, Math])])
<school>
   <students>
      <student>
         <id>1</id>
         <firstName>A</firstName>
         <lastName>C</lastName>
         <company>BCD</company>
         <responsibilities>
            <responsibility>Leader</responsibility>
            <responsibility>Dancer</responsibility>
            <responsibility>Reporter</responsibility>
         </responsibilities>
      </student>
      <student>
         <id>2</id>
         <firstName>B</firstName>
         <lastName>C</lastName>
         <company>EFG</company>
         <responsibilities>
            <responsibility>Singer</responsibility>
         </responsibilities>
      </student>
   </students>
   <Teachers>
      <Teacher>
         <firstName>A</firstName>
         <lastName>C</lastName>
         <responsibilities>
            <responsibility>English</responsibility>
            <responsibility>Hindi</responsibility>
            <responsibility>Softskills</responsibility>
         </responsibilities>
      </Teacher>
      <Teacher>
         <firstName>A</firstName>
         <lastName>C</lastName>
         <responsibilities>
            <responsibility>Science</responsibility>
            <responsibility>Math</responsibility>
         </responsibilities>
      </Teacher>
   </Teachers>
</school>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68832113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档