这是我的方法:
public void Read() {
try{
File fXmlFile = new File("C://Students.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("student");
Student s = new Student(); // Creating a new object
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE){
Element eElement = (Element) nNode;
s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
Student.Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent();
Student.ID = eElement.getAttribute("id");
Student.Spec = eElement.getElementsByTagName("spec").item(0).getTextContent();
Student.Course = eElement.getElementsByTagName("course").item(0).getTextContent();
Student.Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();
students.add(new Student());
}
}
}catch(Exception e){}
}
public static void main(String argv[]){
Student y = new Student();
y.Read();
}
这些是我的班级字段:
ArrayList<Student> students = new ArrayList<>();
public static String First_Name;
public static String Last_Name;
public static String ID;
public static String Spec;
public static String Course;
public static String Ratingstr;
public float Rating;
为什么我要填写第二个&#34; - 对象或第二个学生而不是第一个? 我的意思是当我在第一个循环中使用我的第一个Student对象编写第一个索引时,我需要用第二个学生填充第二个索引,但是我只用第二个学生填充First和第二个索引。我在第二个循环中覆盖了第一个索引。那是为什么?
答案 0 :(得分:0)
首先,您无法将students
放在Student
课程中。这不是一个好主意,您必须创建一个ClassRoom
类students
列表:
类似的东西:
class Student {
public String firstName;
public String fastName;
public String id;
public String spec;
public String course;
public String ratingstr;
public float rating;
}
和
class ClassRoom {
ArrayList<Student> students = new ArrayList<>();
// PUT HERE THE READ METHOD!!!!
// optional:
public String print() {
// print each student inside room.students
for (Student s : room.students) {
// you must have a Student.print() method!!!
s.print();
}
}
}
然后:
public static void main(String argv[]) {
ClassRoom room = new ClassRoom();
room.read();
room.print();
}
第二次:您没有以正确的方式填充数组列表中的对象:
Student.Last_Name
静态引用到类Student
,而不是Student s
实例,正确的方法是:
s.Last_Name
此行正在学生列表中插入一个新的学生空实例,不您填写的s
个实例。
students.add(new Student());
所以你的read
类的ClassRoom
方法的迭代就像:
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
s.firstName = eElement.getElementsByTagName("firstname").item(0).getTextContent();
s.lastName = eElement.getElementsByTagName("lastname").item(0).getTextContent();
s.id = eElement.getAttribute("id");
s.spec = eElement.getElementsByTagName("spec").item(0).getTextContent();
s.course = eElement.getElementsByTagName("course").item(0).getTextContent();
s.ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();
// add the FILLED instance of Student s to ClassRoom.students!!!
students.add(s);
}
第三(可选):
强烈建议您声明Student
属性private
并创建getter
和setter
以安全地修改它们。
Java惯例称,变量名称必须以LOWERCASE
开头,而Class
名称必须以UPPERCASE
开头,class Student
和String firstName
。< / p>
答案 1 :(得分:0)
不要使用静态字段。如果使用静态字段,则它们对于类的每个对象都是相同的。
答案 2 :(得分:-1)
您需要在每次循环迭代中创建一个新的Student实例,您需要填充该实例,然后您需要将该特定实例(而不是另一个新实例)添加到列表中,即:
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
// create a new instance of the Student in every loop iteration
Student s = new Student();// Creating a new object
// ...and then populate that instance:
s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
...
// add that specific instance (not another new one) to the list
students.add(s);
答案 3 :(得分:-1)
这样做。
s.First_Name = eElement.getElementsByTagName("firstname").item(0).getTextContent();
s.Last_Name = eElement.getElementsByTagName("lastname").item(0).getTextContent();
s.ID = eElement.getAttribute("id");
s.Spec = eElement.getElementsByTagName("spec").item(0).getTextContent();
s.Course = eElement.getElementsByTagName("course").item(0).getTextContent();
s.Ratingstr = eElement.getElementsByTagName("rating").item(0).getTextContent();
students.add(s);
同样在循环开始时,创建一个Student
的新实例。现在你只做了一个。每次运行循环时都应该创建一个。