Десериализация XML-файла с использованием сериализатора/десериализатора Java и Simple XML

Это ошибки, которые я получаю. Я понимаю, что есть проблема с моей схемой и что она не может найти элемент ученика. Но почему он не может найти элемент, это выше моего понимания. В идеале я хотел бы, чтобы это работало, чтобы я мог получить имена студентов, оценки и курсы, чтобы рассчитать средневзвешенную оценку и отсортировать студентов по имени. Что я хотел бы знать, так это то, что я делаю неправильно. Я следил за руководствами на веб-сайте простых сериализаторов XML, но я заморочился почему не работает. Кроме того, номер строки, который он дает, ни к чему не приводит в моем коде.

Любая помощь приветствуется.

Exception in thread "main" org.simpleframework.xml.core.ElementException: Element 'students' does not have a match in class Student at line 2
    at org.simpleframework.xml.core.Composite.readElement(Composite.java:527)
    at org.simpleframework.xml.core.Composite.readElements(Composite.java:445)
    at org.simpleframework.xml.core.Composite.access$400(Composite.java:59)
    at org.simpleframework.xml.core.Composite$Injector.read(Composite.java:1433)
    at org.simpleframework.xml.core.Composite.read(Composite.java:201)
    at org.simpleframework.xml.core.Composite.read(Composite.java:148)
    at org.simpleframework.xml.core.Traverser.read(Traverser.java:92)
    at org.simpleframework.xml.core.Persister.read(Persister.java:625)
    at org.simpleframework.xml.core.Persister.read(Persister.java:606)
    at org.simpleframework.xml.core.Persister.read(Persister.java:584)
    at org.simpleframework.xml.core.Persister.read(Persister.java:543)
    at org.simpleframework.xml.core.Persister.read(Persister.java:521)
    at org.simpleframework.xml.core.Persister.read(Persister.java:426)
    at Deserializer.main(Deserializer.java:17)

Это мой XML, который я пытаюсь десериализовать.

<uni>
<students>

   <student>
    <studentName>Joe</studentName>
        <studentCourses>
            <course name="XML" grade="2" />
            <course name="Java" grade="5" />
        </studentCourses>
   </student>

   <student>
    <studentName>Jane</studentName>
        <studentCourses>
            <course name="XML" grade="3" />
            <course name="Java" grade="5" />
        </studentCourses>
   </student>

</students>
</uni>

Мои классы Java, которые должны соответствовать схеме XML.

Уни класс

import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;

@Root(name="uni")
public class Uni {

    @Element(name="students")
    public Students students;

    public Uni(){}
}

Студенческий класс

import java.util.List;

import org.simpleframework.xml.*;


public class Students {

    @ElementList(name="student", entry="students", inline=true)
    public List<Student> student;

    public Students(){}

    public List getProperties(){
        return student;
    }

Студенческий класс

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;

//@Element
public class Student {
        @Element(name="studentName")
        public String studentName;

        @ElementList(name="studentCourses")
        public List<StudentCourses> studentCourses;

        //public Student (){}

        public Student(String studentName){
            this.studentName = studentName;
        }

        public String getStudentName(){
            return this.studentName;
        }
    }

СтудентКурсовый класс

import java.util.List;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;

@Element
public class StudentCourses {

    @ElementList(name="studentCourses")
    public List<Course> course;
}

Класс курса

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;


public class Course {
    @Element(name="course", required=false)
    public String course;

    @Attribute(name="name")
    public String courseName;

    @Attribute(name="grade")
    public int grade;

    //default constructor
    public Course () {}

    public  String getCourseName (String courseName){
        return this.courseName = courseName;
    }

    public int getCourseGrade (int courseGrade){
        return this.grade = courseGrade;
    }
}

Класс десериализатора

import java.io.File;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;





public class Deserializer {

    public static void main(String[] args) throws Exception {

        Serializer serializer = new Persister();
        File result = new File("stud.xml");

        Student student = serializer.read(Student.class, result);
        //Students stud = serializer.read(Students.class, result);

            System.out.println(student.getStudentName());
            //System.out.println(stud.getProperties());



    }

}

person javatrooper    schedule 27.09.2014    source источник


Ответы (1)


Ваш файл XML содержит <uni>, но вы пытаетесь проанализировать его, как если бы это был один Student:

    Student student = serializer.read(Student.class, result);
    System.out.println(student.getStudentName());

Вы уже определили объект, соответствующий <uni>, который может содержать много нулей или много студентов. Разобрать с помощью:

    Uni uni = serializer.read(Uni.class, result);

    for (Student student : uni.students.student) {
        System.out.println(student.getStudentName());
    }
person Joe    schedule 27.09.2014
comment
Спасибо за повтор, но исключение остается прежним. Исключение в потоке main org.simpleframework.xml.core.ElementException: элемент «студент» не имеет совпадения в классе «Студенты» в строке 4 - person javatrooper; 27.09.2014
comment
Ваш @ElementList указывает entry="students", когда элемент XML в вашем документе имеет значение student. - person Joe; 27.09.2014
comment
Спасибо Джо! Это помогло мне узнать имена студентов. Не могли бы вы объяснить свой мыслительный процесс, стоящий за всем этим? потому что теперь я хотел бы получить атрибуты курса из элемента studentCourses, и я думаю, что проблема примерно такая же. - person javatrooper; 27.09.2014
comment
Сообщение об ошибке, которое вы получаете, относится к классу, строке в XML-файле и обнаруженному элементу. Все, что я могу предложить, это сосредоточиться на этих моментах и ​​посмотреть, насколько ожидания синтаксического анализатора отличаются от того, что вы определили. - person Joe; 27.09.2014
comment
Хорошо, спасибо за помощь и совет, Джо! У меня есть несколько дополнительных вопросов, которые не по теме. Они включают в себя получение значений атрибутов и сопоставление их с конкретным элементом ученика, но, думаю, я задам новый вопрос. - person javatrooper; 27.09.2014
comment
помогает в моей ситуации - person Yuliia Ashomok; 06.07.2015