XML之JavaSE Dom4j解析
概述
Dom4j不属于JacaSE的一部分,属于第三方jar包,集成了DOM和SAX的优点。具有DOM操作方便和SAX处理大文件效率高的特点。
Dom4j进行逐行解析,逐行读取,类似SAX,但是每读取一行都会在内存中保存对应的节点信息。
缺点:如果想要像dom一样随意获取到任意一个子节点,不太方便,但可以通过XPath表达式来解决。
优点:1)不需要创建工厂,直接可以获取解析器;2)能够遍历所有的元素,而且返回的不是NodeList,返回的是集合,与JavaAPI无缝对接,可以使用for循环进行遍历;3)可以处理格式(压缩/对齐);4)方便创建节点 DocumentHelper类。
注:使用Dom4j进行解析时,需导包。
1、获取到文档对象来操作XML文档
//利用SAXReader类创建实例化对象
SAXReader reader = new SAXReader();
//创建通过SAXReader的方法实例化Document,注意不要导错包
Document read = reader.read(url);
那么,以上就完成了XML文档对象的创建,为了方便使用,我们可以创建方法专门进行文档对象实例化。
public static Document getDocument(String url){
SAXReader reader = new SAXReader();
Document document = null;
//read方法会抛出异常,这里我们进行异常处理
try {
read = reader.read(url);//url为xml文档路径
} catch (DocumentException e) {
e.printStackTrace();
}
//返回Document对象
return document;
}
2、文档对象中的方法及步骤
1)实例化文档对象
Document document = getDocument(url);//通过上述创建的方法实例化
2)在操作文档时,我们首先需要获取根节点,根节点为文档的第一个元素。
Element rootElement = document.getRootElement();
3、元素的常用方法:获取下一层元素节点
1)Element element(String tagName),通过节点名,获取符合该名称的第一个子元素;
2)Element elements(),获取该元素下一层的子节点集合;
3)Element elements(String tagName),获取该元素下一层符合名称的的子节点集合;
4、元素的常用方法:获取该元素内容
1)String getName(),获取元素名;
2)String getText(),获取元素中文本内容;
3)Element getParent(),获取元素父节点;
4)String getPath(),获取元素在文档中的层级结构。
5)short getNodeType(),获取元素的节点类型,元素节点返回0,属性节点返回2,文本返回3;
5、元素的常用方法:创建和内容查询
1)Element addElement(String tagName),在下层节点最后创建一个节点,节点名为tagName,返回创建的节点;
2)Element addText(String data),添加该节点的文本内容data,返回创建的文本节点;
操作完后,需将document回写进入文档。
3)setText(String data),设置该节点的文本内容data;
简单举例,还可以获得元素属性及添加元素属性等,不再一一举例。
6、元素的常用方法:删除操作
1)boolean remove(Element deleteElement),删除下一层子节点,删除成功返回true,否则返回false;
2)boolean remove(Attribute attribute),删除属性,删除成功返回true,否则返回false;
3)boolean remove(Text text),删除文本,删除成功返回true,否则返回false;
7、元素的常用方法:集合操作
通过得到节点集合后,可通过集合的增加或删除操作完成文档内容操作
add,remove,set等,方法同集合方法一致,这里不再详细讲解。
操作完后,需将document回写进入文档。
8、元素的常用方法:DocumentHelper创建节点
static Element createElement(String tagName);创建名为tagName的节点,改节点暂时不输入文档之中,需要通过节点添加方法或集合添加方法加入文档对象中。
操作完后,需将document回写进入文档。
9、元素的常用方法:回写操作(以回写方法为例)
//传入Document实例,isPretty表示是否输出漂亮的文档格式
public static void writeBack(Document document,boolean isPretty) {
//声明类
XMLWriter writer = null;
try {
//输出流格式,true表示漂亮的格式,false为压缩格式
OutputFormat format = isPretty?OutputFormat.createPrettyPrint():OutputFormat.createCompactFormat();
//实例化XMLwriter对象 ,使用字符转换流,编码方式需设置为"UTF-8"
//url表示文档地址
writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(url),"UTF-8"),format);
//document对象写入文档
writer.write(document);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}