一、概述
DOM4J是一个易用的、开源的库,用于XML、XPath和XSLT中。采用了Java集合框架并完全支持DOM、SAX、和JAXP。
DOM4J最大的特色是使用大量的接口,主要接口都在org.dom4j这个包里定义:
二、DOM4J的接口
Attribute:定义了XML的属性;
Branch:是能够包含子节点的节点,如XML元素(Element)和文档(Documents)定义了一个公共的行为;
CDATA:定义了XML的CDATA区域;
CharacterData:是一个标识接口,标致基于字符的节点:(CDATA、Comment、Text);
Comment:定义了XML注释的行为;
Document:定义了XML文档;
DocumentType:定义了XML的DOCTYPE声明;
Element:定义了XML文档;
ElementHandler:定义了Element对象的处理器;
ElementPath:被ElementHandler使用,用于取得当前正在处理的路径层次信息;
Entity:定义XML的entity;
Node:为所有的DOM4J中XML节点定义了多态行为;
NodeFilter:定义了在DOM4J节点中产生的一个滤镜或谓词的行为(predicate);
ProcessingInstruction:定义XML处理指令;
Text:定义XML文本节点;
Visitor:用于实现Visitor模式;
XPath:在分析一个字符串后会提供一个XPath表达式。
三、使用DOM4J操作XML数据
1.Document对象相关
读取XML文件,获得document对象。
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.节点相关
获取文档的根元素
Element rootElm = document.getRootElement();
取得某节点的单个子节点
Element memberElm = root.element("member");//"member"是节点名
取得节点的文字
String text = memberElm.getText();
String text = root.elementText("name");//取得根元素下的name子节点的文字
取得某节点下名为“member”的所有子节点并进行遍历
List nodes = rootElm.elements("member");
for(Iterator it=nodes.iterator;it.hasNext();){
Element elm = (Element)it.next();
}
对某节点下的所有子节点进行遍历
for(Iterator it = root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
}
在某节点下添加子节点
Element ageElm = newMemberElm.addElement("age");
设置节点文字
ageElm.setText("29");
删除某节点
parentElm.remove(childElm);//childElm是待删除的节点,parentElm是其父节点
3.相关属性
取得某节点下的属性
Element root = document.getRootElement();
Attribute attribute = root.attribute("size");//属性名name
取得属性的文字
String text = attribute.getText();
String text = root.element("name").attributeValue("firstname");
遍历某节点的所有属性
Element root = document.getRootElement();
for(Iterator it = root.attributeIterator();it.hasNext();{
Attribute attribute = (Attribute)it.next();
String text = attribute.getText();
System.out.println(text);
}
设置某节点的属性和文字
newMemberElm.addAttribute("name","sitinspring");
设置属性的文字
Attribute attribute = root.attribute("name");
attribute.setText("sitinspring");
删除某属性
Attribute attribute = root.attribute("size");
root.remove(attribute);
4.将文档写入XML文件
(1)文档中全为英文,不设置编码格式,直接写入
XMLWriter writer = new XMLWriter(new FileWriter("output.xml");
writer.write(document);
writer.close();
(2)文档中含有中文,设置编码格式在写入
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
writer.write(document);
writer.close();
四、案例:使用DOM4J读取XML文档,步骤如下:
1.导入DOM4J的jar包
2.指定要解析的XML文件
3.把XML文件转换成Document对象
4.获取节点属性或文本的值
1 import java.io.File; 2 import java.util.Iterator; 3 4 import org.dom4j.Document; 5 import org.dom4j.DocumentException; 6 import org.dom4j.Element; 7 import org.dom4j.io.SAXReader; 8 9 /** 10 * 使用DOM4J解析XML文档 11 * @author Administrator 12 * 13 */ 14 public class PhoneDom4j { 15 16 public static void main(String[] args) { 17 Document phone = null; 18 try { 19 //加载DOM树 20 SAXReader saxReader = new SAXReader(); 21 phone = saxReader.read(new File("src/phoneInfo.xml")); 22 } catch (DocumentException e) { 23 e.printStackTrace(); 24 } 25 //获取xml的根节点 26 Element root = phone.getRootElement(); 27 //遍历所有的Brand标签 28 for (Iterator<?> itBrand = root.elementIterator(); itBrand.hasNext();) { 29 Element brand = (Element) itBrand.next(); 30 //输出标签的属性 31 System.out.println("品牌:"+brand.attributeValue("name")); 32 //遍历Type标签 33 for (Iterator<?> itType = brand.elementIterator(); itType.hasNext();) { 34 Element type = (Element) itType.next(); 35 //输出标签的name属性 36 System.out.println("\t型号:"+type.attributeValue("name")); 37 } 38 } 39 40 } 41 42 }