一.前言
dom4j是一套非常优秀的Java开源api,主要用于读写xml文档,具有性能优异、功能强大、和非常方便使用的特点。 另外xml经常用于数据交换的载体,像调用webservice传递的参数,以及数据做同步操作等等, 所以使用dom4j解析xml是非常有必要的。
二.准备
自己在网上下载dom4j.jar
三.实战
实现思路:
<1>根据读取的xml路径,传递给SAXReader之后 返回一个Document文档对象;
<2>然后操作这个Document对象,获取下面的节点以及子节点的信息;
“`
package com.jlu.cn.experiment;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.jlu.xmlparser.contest;
public class PubmedParser {
/**
* @param args
*/
public static void main(String[] args) {
try {
//创建SAXReader读取器,专门用于读取xml
SAXReader reader=new SAXReader();
//创建一个Document对象
Document doc = reader.read("C:\\Users\\Administrator\\Desktop\\paper\\ literature\\meldd002.xml");
//获取根节点对象
Element rootElement=doc.getRootElement();
System.out.println("根节点的名称"+rootElement.getName());
System.out.println("节点属性的数目"+rootElement.attributeCount());
System.out.println("根节点内文本"+rootElement.getText());
//获取子节点,通过element("子节点名称的方法获取"),可以连续使用
Element ele=rootElement.element("MedlineCitation");
System.out.println(ele.getName());
System.out.println(ele.attributeCount());
System.out.println(ele.getText());
//数据集中,有一些数据有一些数据便签格式并不统一,所以要判断某些子节点是否为空,为了避免空指针异常
for (Element eles : eleList) {
if(eles.element("MedlineCitation").element("Article").elements("Abstract").size()>0 )
{
//System.out.println(eles.element("PubmedData").getName());
String temp1=eles.element("MedlineCitation").element("Article").element("ArticleTitle").getText();
String temp2=eles.element("MedlineCitation").element("Article").element("Abstract").element("AbstractText").getText();
/*if(!temp1.equals("") && !temp2.equals("") && temp1!=null && temp2!=null )
{*/
//将文档的标题和摘要的内容写入到字节数组中
ByteArrayOutputStream bio=new ByteArrayOutputStream();
bio.write(temp1.getBytes());//将string转化为字节数组通过getBytes()
//bio.write(65);
bio.write(temp2.getBytes());
//bio.write(93);
//将字节数组中的内容写入到文件当中,用writeTo的方法,true代表可以追加不会覆盖原有的内容
FileOutputStream fio=new FileOutputStream("E:\\zhangsan\\experimentdata.txt",true);
bio.writeTo(fio);
fio.close();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
数据集中标签的格式如下,多层子节点