我可以在XML输出方法中使用循环吗?

时间:2015-07-22 16:36:06

标签: java xml

下面的方法应该包含所有存储的学生并生成包含数据的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){



    }      

}

1 个答案:

答案 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>