下面的方法应该包含所有存储的学生并生成包含数据的XML文件。因为XML的结构正确,但两个条目都是相同的。我没有获得student1和student2的数据,而是连续两次获得student2。我在这里想念什么?
public void exportStudentXML(ArrayList <Student> studentListIn ){
ArrayList <Student> studentList = studentListIn;
DocumentBuilderFactory myDocBuilderFactory = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder myDocBuilder = myDocBuilderFactory.newDocumentBuilder();
Document documentModel = myDocBuilder.newDocument();
Element root = documentModel.createElement("studentList");
documentModel.appendChild(root);
for (Student thisStudent : studentList){
Element listElement = documentModel.createElement("student");
root.appendChild(listElement);
Element nameElement = documentModel.createElement("name");
Text nameText = documentModel.createTextNode(thisStudent.name);
nameElement.appendChild(nameText);
listElement.appendChild(nameElement);
Element addressElement = documentModel.createElement("address");
Text addressText = documentModel.createTextNode(thisStudent.address);
addressElement.appendChild(addressText);
listElement.appendChild(addressElement);
Element ssnElement = documentModel.createElement("ssn");
Text ssnText = documentModel.createTextNode(thisStudent.socialSecurityNumber);
ssnElement.appendChild(ssnText);
listElement.appendChild(ssnElement);
Element dobElement = documentModel.createElement("dob");
Text dobText = documentModel.createTextNode(thisStudent.toStringDOB());
dobElement.appendChild(dobText);
listElement.appendChild(dobElement);
Element dogElement = documentModel.createElement("dog");
Text dogText = documentModel.createTextNode(thisStudent.toStringDOG());
dogElement.appendChild(dogText);
listElement.appendChild(dogElement);
Element gpaElement = documentModel.createElement("gpa");
Text gpaText = documentModel.createTextNode(thisStudent.toStringGPA());
gpaElement.appendChild(gpaText);
listElement.appendChild(gpaElement);
}
OutputFormat formatToOutput = new OutputFormat(documentModel);
formatToOutput.setIndenting(true);
XMLSerializer serializer = new XMLSerializer( new FileOutputStream( new File("studentlist.xml")), formatToOutput );
serializer.serialize(documentModel);
}catch(Exception e){
}
}
答案 0 :(得分:2)
此代码工作正常,问题出在您未向我们展示的代码中:class Student
- 您将所有字段声明为static
,这意味着有只有一个副本,当你创建&#34;多个学生&#34;每个新生都会覆盖前一个学生的值。
在类Student(名称,地址等)中的所有成员和您的代码都可以使用之前删除static
关键字。这是一个工作示例,对您的代码进行了一些小修改:
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
class StudentsToXML {
public static void main(String[] args) {
ArrayList <Student> studentList = new ArrayList<>();
studentList.add(new Student("John", "CA", "123"));
studentList.add(new Student("Mark", "AZ", "456"));
exportStudentXML(studentList);
}
public static void exportStudentXML(ArrayList <Student> studentList ){
DocumentBuilderFactory myDocBuilderFactory = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder myDocBuilder = myDocBuilderFactory.newDocumentBuilder();
Document documentModel = myDocBuilder.newDocument();
Element root = documentModel.createElement("studentList");
documentModel.appendChild(root);
for (Student thisStudent : studentList){
Element listElement = documentModel.createElement("student");
root.appendChild(listElement);
Element nameElement = documentModel.createElement("name");
nameElement.appendChild(documentModel.createTextNode(thisStudent.name));
listElement.appendChild(nameElement);
Element addressElement = documentModel.createElement("address");
addressElement.appendChild(documentModel.createTextNode(thisStudent.address));
listElement.appendChild(addressElement);
Element ssnElement = documentModel.createElement("ssn");
ssnElement.appendChild(documentModel.createTextNode(thisStudent.socialSecurityNumber));
listElement.appendChild(ssnElement);
}
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(documentModel);
StreamResult result = new StreamResult(new File("studentlist.xml"));
transformer.transform(source, result);
System.out.println("File saved!");
}catch(Exception e){
e.printStackTrace()
}
}
}
class Student {
Student (String name, String addr, String soc) {
this.name = name;
address = addr;
socialSecurityNumber = soc;
}
static String name = "";
static String address = "";
static String socialSecurityNumber = "";
}
OUTPUT文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<studentList>
<student><name>John</name><address>CA</address><ssn>123</ssn></student>
<student><name>Mark</name><address>AZ</address><ssn>456</ssn></student>
</studentList>