java学习笔记:使用dom4j解析xml

最近写程序需要用java解析xml文件,于是在网上借鉴了一下“残缺的孤独”的博客,使用了dom4j方法。

 

xml格式如下:

211059_6SAK_2619218.png

解析的核心代码:

@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等均为根节点之下的子节点。

先介绍一下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()方法。

 

特别注意:在写程序过程中,我还遇到空指针NullPointerException异常,原因是当该节点不存在时,找不到该节点,则会报空指针异常错误。我解决的办法是在将数据set到数据库之前加了判断语句 if(e.elementText("AwardTitle")!=null)。

 

转载于:https://my.oschina.net/u/2619218/blog/626160

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值