java學習筆記:使用dom4j解析xml

最近寫程序須要用java解析xml文件,因而在網上借鑑了一下「殘缺的孤獨」的博客,使用了dom4j方法。java

 

xml格式以下:數據庫

解析的核心代碼:dom

@SuppressWarnings({ "unchecked", "rawtypes" })  
public Proposal parseXml(String xmlPath) throws IOException{  
    Proposal proposal=new Proposal();  
    File Xml=new File(xmlPath);   
    SAXReader saxReader = new SAXReader();  
    try {   
        Document document = saxReader.read(Xml); //讀取文件,轉化爲Document  
        Element root = document.getRootElement();//獲取xml的根節點  
        List<Element> elementList = root.elements();//獲取根節點之下的各子節點  
        for (Element e : elementList) {//foreach遍歷  
            //title  
            if(e.elementText("AwardTitle")!=null){  
                if(!e.elementText("AwardTitle").equals(""))  
                    proposal.setTitle(e.elementText("AwardTitle").replaceAll("& ","").trim());  
                System.out.println("title:"+proposal.getTitle());  
            }  
            //awarded_amount  
            if(e.elementText("AwardAmount")!=null){  
                if(!e.elementText("AwardAmount").equals(""))  
                    proposal.setAwarded_amount(e.elementText("AwardAmount").trim());  
                System.out.println("awarded_amount:"+proposal.getAwarded_amount());  
            }  
  
            //nsf_directorate  
            Element Organization=e.element("Organization");  
            if(Organization!=null){  
                Element Directorate=Organization.element("Directorate");  
                if(Directorate!=null){  
                    if(Directorate.elementText("LongName")!=null){  
                        if(!Directorate.elementText("LongName").equals(""))  
                            proposal.setNsf_directorate(Directorate.elementText("LongName").replaceAll("& ", "").trim());  
                        System.out.println("nsf_directorate:"+proposal.getNsf_directorate());  
                    }  
                }  
            }  
        }  
        //program_element_code  
        List<String> Listprogram_element_code=new ArrayList();  
        List<Element> ListProgramElement=new ArrayList();  
        ListProgramElement=e.elements("ProgramElement");  
        for(Element ProgramElement:ListProgramElement){  
            System.out.println("program_element_code:"+ProgramElement.elementText("Code").trim());  
            Listprogram_element_code.add(ProgramElement.elementText("Code").trim());  
        }  
  
        if(Listprogram_element_code.size()!=0)  
        proposal.setProgram_element_code(Listprogram_element_code);  
    }catch (DocumentException e) {   
        System.out.println(e.getMessage());   
    }  
    return proposal;  
}

其中該xml的根節點即爲award,AwardTitle、AwardAmount等均爲根節點之下的子節點。spa

先介紹一下e.elementText()、e.element()、e.elements()三種方法的區別:e.elementText("AwardTitle")返回的是以AwardTitle爲名的節點的文本的值,返回的類型是String;e.element("Organization")返回的是以Organization爲名的結點,返回類型爲Element;e.elements(「ProgramElement」)返回的是以ProgramElement爲名的全部節點(即有多個同名節點時使用該方法),返回類型爲List。指針

AwardTitle、AwardAmount通常的節點,使用e.elementText()方法便可;像Value這種子節點,須要先使用e.element()方法得到Organization節點,以後e.elementText()返回文本部分;而像ProgramElement有多個,須要定義一個List,使用e.elements()方法。code

 

特別注意:在寫程序過程當中,我還遇到空指針NullPointerException異常,緣由是當該節點不存在時,找不到該節點,則會報空指針異常錯誤。我解決的辦法是在將數據set到數據庫以前加了判斷語句 if(e.elementText("AwardTitle")!=null)。xml

相關文章
相關標籤/搜索