DOM4J介绍
DOM4J是dom4j.org出品的一个开源的XML解析包。DOM4J应用于Java平台,采用lJava集合框架并完全支持DOM、SAX和JAXP。
DOM4J使用非常简单。只要了解基本的XML-DOM模型,就能使用。
Dom:把一个文档作为一个对象。
DOM4J最大的特点是使用大量的接口,他的主要接口都在org.dom4j里面定义。
接口名 | 定义 |
---|---|
Atribute | 定义了XML的属性 |
Branch | 指能够包含字节点的节点。如XML元素(Element)和文档(Document)定义了一个公共的行为 |
CDDATA | 定义了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表达式 |
各接口的继承关系如下:
- interface java.lang.Cloneable
- interface org.dom4j.**Node
- interface org.dom4j.Attribute
- interface org.dom4j.Branch
- interface org.dom4j.Document
- interface org.dom4j.Element
- interface org.dom4j.CharacterData
- interface org.dom4j.CDATA
- interface org.dom4j.Comment
- interface org.dom4j.Text
- interface org.dom4j.DocumentType
- interface org.dom4j.Entity
- interface org.dom4j.ProcessingInstruction
- interface org.dom4j.**Node
XML 文档操作
XML:是一种简单的基于文本的语言,它被设计为储存和运输以纯文本格式的数据,XML标签可以自己定义。
读取XML文档
读写XML额外拿的那个主要依赖于org.dom4j.io
包,有DOMReader
和SAXReader
两种方式。因为利用了相同的接口,他们的调用方式是一样的。
public static Document load(String filename){
Document doc = null;
try{
SAXReader reader = new SAXReader();
doc = reader.read(new File(filename));
}catch(Exception e){
e.printStackTrace;
}
return doc;
}
public static Document load(URL url){
Document doc = null;
try{
SAXReader reader = new SAXReader();
doc = reader.read(url));
}catch(Exception e){
e.printStackTrace;
}
return doc;
}
读取指定的XML文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Dom操作。执照XML文件头所定义的编码来转换。
获取根结点
根结点是XML分析的开始,任何XML分析工作哦度需要从 根开始。
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));
//获取根节点
Element element = doc.getRootElement();
增删改查
增加节点
//实例:
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入添加书的简称:");
String Jname = sc.next();
System.out.println("请输入添加书的id:");
String id = sc.next();
System.out.println("请输入添加书的name:");
String name = sc.next();
//将xml文件转为Doc对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));
//获取根节点
Element element = doc.getRootElement();
//在根结点上添加新的book节点
Element newbook = element.addElement("book");
newbook.addAttribute("name", Jname);
//在book节点中添加数据
Element newid = newbook.addElement("id");
newid.setText(id);
Element newname = newbook.addElement("name");
newname.setText(name);
//保存
try {
OutputFormat of =OutputFormat.createCompactFormat();
of.setEncoding("uft-8");
XMLWriter writer = new XMLWriter(new FileWriter(new File("filename")));
writer.write(doc);
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
sc.close();
}
删除节点
//实例:
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要删除的节点:");
String findname = sc.next();
//将XML文件转为Doc对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));
//获取根结点
Element element = doc.getRootElement();
Iterator<?> iterator = element.elementIterator();
while(iterator.hasNext()) {
Element element1 = (Element) iterator.next();
if(findname.equals(element1.attributeValue("name"))) {
Element ele = element1;
ele.getParent().remove(ele);
}
}
//保存
try {
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileWriter("filename"),of);
writer.write(doc);
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
sc.close();
}
更改节点
//实例
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要修改书的简称:");
String findname = sc.next();
//将XML文件转为doc对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));
//获取根结点
Element element = doc.getRootElement();
Iterator<?> iterator = element.elementIterator();
while(iterator.hasNext()) {
//获取字节节点
Element element1 = (Element)iterator.next();
if(findname.equals(element1.attributeValue("name"))) {
//定义新的节点
Element ele = element1;
//创建用于存放数据的list集合
@SuppressWarnings("unchecked")
List<Element> list = ele.elements();
if(list!=null) {
System.out.println("1.编号 2.书名");
System.out.println(list.get(0)+" "+list.get(1));
}else {
System.out.println("查无此书"+findname);
}
//查到相应书籍
System.out.println("请输入需要修改的序号");
int num = sc.nextInt();
if(num==1) {
System.out.println("请输入新的id:");
list.get(0).setText(sc.next());
}else {
System.out.println("请输入新的name:");
list.get(1).setText(sc.next());
}
}
}
//保存
try {
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
XMLWriter writer;
writer = new XMLWriter(new FileWriter("filename"));
writer.write(doc);
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
sc.close();
}
查看节点
//实例
public static void main(String[] args) throws Exception {
//定义list集合用来存储数据
ArrayList<Book> bookslist = new ArrayList<Book>();
//将XML文件封装为doc对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));//此处将抛出异常
//获取doc对象的字节点
Element element = doc.getRootElement();
//迭代器
Iterator<?> iterator = element.elementIterator();
while(iterator.hasNext()) {
//获取字节点
Element element1 = (Element)iterator.next();
Book book = new Book();
Iterator<?> iterator1 = element1.elementIterator();
while(iterator1.hasNext()) {
Element element2 = (Element)iterator1.next();
//获取字节点的相关信息
if("id".equals(element2.getName())) {
//get.Text():获取相关数据,此处需要转型
book.setId(Integer.parseInt(element2.getText()));
}else if("name".equals(element2.getName())) {
book.setName(element2.getText());
}
}bookslist.add(book);
}
//遍历
for(Book book : bookslist) {
System.out.println(book.getId()+" "+book.getName());
}
}
Document对象相关
-
读取XML文件,获取Document对象
SAXReader reader = new SAXReader(); Document doc = new reader.read(new File("filename"))
-
解析XML形式的文本,得到document对象
String text = "<members></members>" Document doc =DocumentHelper.praseText(text);
-
主动创建document对象
Document doc = DocumentHelper.createDocument(); Element root = document.addElement("members");
节点相关
-
获取文档的根节点
Element rootele = document.gerRootElement();
-
获得某节点的单个子节点
Element memberele = root.element("member");
-
取得节点的文字
String text = memberele.getText(); //取得根结点下的name节点的文字 String text = root.elementText("name");
-
取得某节点下指定名称的所有节点并进行遍历
List nodes = rootele.elements("member"); for(Iterator it = nodes.iterator(); it.hasNext();){ Element ele = (Element)it.next(); }
-
对某节点下的所有子节点进行遍历
for(Iterator it = root.elementIterator(); it.hasNext();){ Element elemetn = (Element) it.next(); //do something }
-
某节点下添加子节点
Element ageele = newMemberEle.addElement("age";)
-
设置节点文字
ageele.setText("12");
-
删除某节点
parentele.remove(childele);//parentele是父节点,childele是呆删的子节点
-
添加一个CDATA节点
Element contentele = infoele.addElement("contect"); contectele.addCDARA(diary.gerContect());
属性相关
-
取得节点的指定的属性
Element root = document.getRootElement(); Attribute attribute = root.attribute("size");
-
取得属性的文字
String text = attribute.getText(); //获取根结点下name子节点的firstname属性的值 String text2 = 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");// 属性名name root.remove(attribute);
将文档写入XML文件
-
文档中全为英文,不设置编码,直接写入
XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close();
-
文档中含有中文,设置编码格式再写入
OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); // 指定XML编码 XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format); writer.write(document); writer.close();
字符串与XML的转换
-
字符串与XML的转换
String text = "<members> <member>sitinspring</member> </members>"; Document document = DocumentHelper.parseText(text);
-
将文档或节点的XML转化为字符串
AXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); Element root=document.getRootElement(); String docXmlText=document.asXML(); String rootXmlText=root.asXML(); Element memberElm=root.element("member"); String memberXmlText=memberElm.asXML();
DOM4J的类和接口
类:SAXReader
当解析到path指定的路径时,将调用参数handler指定的处理器。正对不同的节点可以添加多个handler实例。或者调用默认的HandlersetDefaultJandler(ElementHandler handler);
接口:ElementHandler
该方法在解析到元素的开始、结束标签时被调用。
接口:ElementPath
该方法与SAXReader类中的addHandler()方法的作用相同。路径path可以是绝对路径(路径以/开头),也可以是相对路径(假设是当前路径的子节点路径)。
移除指定路径上的ElementHandler实例。路径可以是相对路径,也可以是绝对路径。
该方法得到当前节点的路径,该方法返回的是完整的绝对路径。
Element类
方法名 | 定义 |
---|---|
getText() | 元素所罕有的text内容,如果内容为空则返回一个空字符串而不是null |
attributeValue() | 元素的某个指定属性所含有的值 |
elementIterator() | 元素属性的iterator,其中每个元素都是Element |
DocumentHelper类
DocumentHelper是用来生成XML文档的工厂类