簡體   English   中英

如何使用DOM解析復雜的XML文件?

[英]How do I parse complex XML file using DOM?

如何使用DOM解析復雜的XML文件? 我需要訪問每個年級的孩子,但是我正在xml文件中獲取所有班級。如何訪問年級,孩子,學生和老師元素。

public SchoolM readFileNBuildModel(String filePath) {
    File file = new File(filePath);
    if (file.exists()) {
        AppLauncher.getLog().log(Level.INFO, " File Exist : " + filePath,filePath);
        try {
            AppLauncher.getLog().log(Level.INFO, " Parsing File : " + filePath,filePath);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder;
            documentBuilder = dbf.newDocumentBuilder();
            Document doc = documentBuilder.parse(file);
            doc.getDocumentElement().normalize();
            Element schoolNode = doc.getDocumentElement();
            NodeList gradeList = doc.getElementsByTagName("grade");
            SortedSet<GradeM> gradeSet = new TreeSet<GradeM>();
            for (int temp = 0; temp < gradeList.getLength(); temp++) {
                Node gradeNode = gradeList.item(temp);
                Element gradeElemet = (Element) gradeNode;
                GradeM gradeM = new GradeM(gradeElemet.getAttribute("id"));
                SortedSet<ClassM> classSet = new TreeSet<ClassM>();
                NodeList classList = doc.getElementsByTagName("classroom");
                for (int classIndex = 0; classIndex < classList.getLength(); classIndex++) {
                    Node classNode = classList.item(classIndex);
                    Element classElement = (Element) classNode;
                    ClassM classM = new ClassM(classElement.getAttribute(CSVColumnAttributeEnum.CLASSROOM_ID.getXmlMapColumnName()),
                            classElement.getAttribute(CSVColumnAttributeEnum.CLASSROOM_NAME.getXmlMapColumnName()));
                    SortedSet<TeacherM> teacherSet = new TreeSet<TeacherM>();
                    SortedSet<StudentM> studentSet = new TreeSet<StudentM>();
                    NodeList teacherList = doc.getElementsByTagName("teacher");
                    NodeList studentList = doc.getElementsByTagName("student");
                    for (int studentIndex = 0; studentIndex < studentList.getLength(); studentIndex++) {
                        Node studentNode = studentList.item(studentIndex);
                        Element studentElement = (Element) studentNode;
                        if(studentElement != null){
                            StudentM studentM = new StudentM(studentElement.getAttribute(CSVColumnAttributeEnum.STUDENT_ID.getXmlMapColumnName()),
                                studentElement.getAttribute(CSVColumnAttributeEnum.STUDENT_FIRST_NAME.getXmlMapColumnName()), studentElement.getAttribute(CSVColumnAttributeEnum.STUDENT_LAST_NAME.getXmlMapColumnName()),
                                studentElement.getAttribute(CSVColumnAttributeEnum.STUDENT_GRADE.getXmlMapColumnName()));
                            studentSet.add(studentM);
                        }
                    }
                    for (int teacherIndex = 0; teacherIndex < teacherList.getLength(); teacherIndex++) {
                        Node teacherNode = teacherList.item(classIndex);
                        Element teacherElement = (Element) teacherNode;
                        if(teacherElement != null){
                            TeacherM teacherM = new TeacherM(teacherElement.getAttribute(CSVColumnAttributeEnum.TEACHER1_ID.getXmlMapColumnName()),
                                teacherElement.getAttribute(CSVColumnAttributeEnum.TEACHER1_LAST_NAME.getXmlMapColumnName()), teacherElement.getAttribute(CSVColumnAttributeEnum.TEACHER1_FIRST_NAME.getXmlMapColumnName()));
                            teacherSet.add(teacherM);
                        }
                    }
                    classM.setStudentSet(studentSet);
                    classM.setTeacherSet(teacherSet);
                    classSet.add(classM);
                }
                gradeM.setClassSet(classSet);
                gradeSet.add(gradeM);
            }
            SchoolM schoolM = new SchoolM(schoolNode.getAttribute("id"), schoolNode.getAttribute("schoolName"),gradeSet);
            return schoolM;
        } catch (ParserConfigurationException e) {
            AppLauncher.getLog().log(Level.SEVERE, " File Conversion failed because of  : /n" + e.toString());
        } catch (SAXException e) {
            AppLauncher.getLog().log(Level.SEVERE, " File Conversion failed because of  : /n" + e.toString());
        } catch (IOException e) {
            AppLauncher.getLog().log(Level.SEVERE, " File Conversion failed because of  : /n" + e.toString());
        }
    }else{
        AppLauncher.getLog().log(Level.WARNING, " File Does Not Exist : " + filePath,filePath);
    }
    return new SchoolM(); 

XML檔案:

<grade id="1">
    <classroom id="101" name="Mrs. Jones' Math Class">
        <teacher id="10100000001" first_name="Barbara" last_name="Jones"/>

        <student id="10100000010" first_name="Michael" last_name="Gil"/>
        <student id="10100000011" first_name="Kimberly" last_name="Gutierrez"/>
        <student id="10100000013" first_name="Toby" last_name="Mercado"/>
        <student id="10100000014" first_name="Lizzie" last_name="Garcia"/>
        <student id="10100000015" first_name="Alex" last_name="Cruz"/>
    </classroom>


    <classroom id="102" name="Mr. Smith's PhysEd Class">
        <teacher id="10200000001" first_name="Arthur" last_name="Smith"/>
        <teacher id="10200000011" first_name="John" last_name="Patterson"/>

        <student id="10200000010" first_name="Nathaniel" last_name="Smith"/>
        <student id="10200000011" first_name="Brandon" last_name="McCrancy"/>
        <student id="10200000012" first_name="Elizabeth" last_name="Marco"/>
        <student id="10200000013" first_name="Erica" last_name="Lanni"/>
        <student id="10200000014" first_name="Michael" last_name="Flores"/>
        <student id="10200000015" first_name="Jasmin" last_name="Hill"/>
        <student id="10200000016" first_name="Brittany" last_name="Perez"/>
        <student id="10200000017" first_name="William" last_name="Hiram"/>
        <student id="10200000018" first_name="Alexis" last_name="Reginald"/>
        <student id="10200000019" first_name="Matthew" last_name="Gayle"/>
    </classroom>
    <classroom id="103" name="Brian's Homeroom">
        <teacher id="10300000001" first_name="Brian" last_name="O'Donnell"/>
    </classroom>
</grade>

在要處理的元素上使用getElementsByTagName方法,例如,使用gradeElemet.getElementByTagName("classroom")代替doc.getElementsByTagName("classroom") 然后,在所有嵌套循環中繼續執行該方法,以在當前處理的元素而非整個文檔上調用該方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM