有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

  1. # 1 楼答案

    这段代码运行良好,问题在于您没有向我们展示的代码中:classStudent-您将那里的所有字段声明为static,这意味着只有一个副本,当您创建“多个学生”时,每个新学生都会覆盖上一个副本的值

    在班上所有学生成员(姓名、地址等)之前删除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 = "";
    
    }
    

    输出文件:

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