您的位置:首页 > 编程语言 > Java开发

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

2016-02-29 00:00 826 查看
摘要: 使用dom4j方法解析xml文件,以及e.elementText()、e.element()、e.elements()三种方法的区别

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

xml格式如下:



解析的核心代码:

@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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dom4j解析xml