【问题标题】:a nested xml unmarshalling using jaxb使用 jaxb 的嵌套 xml 解组
【发布时间】:2021-10-20 05:36:24
【问题描述】:

我有一个xml结构如下:

<?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>

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

如下所示:

import lombok.Data;
@Data
@XmlRootElement(name="school")
public class School {

    private List<Students> Students;
    private List<Teachers> Teachers;
}
@Data
public class Students {
    private List<Student> student;
}
@Data
public class Student {  
    private long Id;    
    private String firstName;   
    private String lastName;    
    private String company; 
    private Responsibilities Responsibilities;
}

@XmlAccessorType(XmlAccessType.PROPERTY)

public class Responsibilities { 
    public List<String> responsibility ;    
}
public class Responsibility {
    private String responsibility;
}
@Data
public class Teachers {

    private List<Teacher> teacher;
}

public class Teacher {
    private String firstName;   
    private String lastName;
    private String company; 
    private Responsibilities Responsibilities;
}

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

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

}

我也希望得到教师条目。但我在这里只得到学生。 输出:

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)

请在这里提出我的错误并给我一些指导

【问题讨论】:

    标签: java xml-parsing jaxb lombok unmarshalling


    【解决方案1】:

    以下代码对你有用:

    学校.class

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

    教师班:

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

    学生班级:

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

    主类:

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

    以下是输出:

    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>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多