与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器。
所用jar包:dom4j-1.6.1.jar
常用API
class org.dom4j.io.SAXReader
- read 提供多种读取xml文件的方式,返回一个Domcument对象
interface org.dom4j.Document
- iterator 使用此法获取node
- getRootElement 获取根节点
interface org.dom4j.Node
- getName 获取node名字,例如获取根节点名称为bookstore
- getNodeType 获取node类型常量值,例如获取到bookstore类型为1——Element
- getNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Element
interface org.dom4j.Element
- attributes 返回该元素的属性列表
- attributeValue 根据传入的属性名获取属性值
- elementIterator 返回包含子元素的迭代器
- elements 返回包含子元素的列表
interface org.dom4j.Attribute
- getName 获取属性名
- getValue 获取属性值
interface org.dom4j.Text
- getText 获取Text节点值
interface org.dom4j.CDATA
- getText 获取CDATA Section值
interface org.dom4j.Comment
- getText 获取注释
需要解析的xml文件:people.xml
1 <people city="BeiJing"> 2 <student name="Jack" age="10">My name is Jack!</student> 3 <student name="Lucy" age="11">My name is Lucy!</student> 4 <student name="James" age="12"/> 5 <teacher name="Jason" age="25">I am a teacher!</teacher> 6 <teacher name="Michael" age="30">I am a teacher too!</teacher> 7 </people>
首先根据xml文档构建javabean:
1 package bean; 2 3 import java.util.List; 4 5 public class People { 6 private String city; 7 private List<Student> student; 8 private List<Teacher> teacher; 9 10 public String getCity() { 11 return city; 12 } 13 public void setCity(String city) { 14 this.city = city; 15 } 16 public List<Student> getStudent() { 17 return student; 18 } 19 public void setStudent(List<Student> student) { 20 this.student = student; 21 } 22 public List<Teacher> getTeacher() { 23 return teacher; 24 } 25 public void setTeacher(List<Teacher> teacher) { 26 this.teacher = teacher; 27 } 28 }
1 package bean; 2 3 public class Student { 4 private String name; 5 private int age; 6 private String text; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public int getAge() { 14 return age; 15 } 16 public void setAge(int age) { 17 this.age = age; 18 } 19 public String getResult() { 20 return text; 21 } 22 public void setResult(String result) { 23 this.text = result; 24 } 25 public Student(String name, int age, String text) { 26 super(); 27 this.name = name; 28 this.age = age; 29 this.text = text; 30 } 31 }
1 package bean; 2 3 public class Teacher { 4 private String name; 5 private int age; 6 private String text; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public int getAge() { 14 return age; 15 } 16 public void setAge(int age) { 17 this.age = age; 18 } 19 public String getResult() { 20 return text; 21 } 22 public void setResult(String result) { 23 this.text = result; 24 } 25 public Teacher(String name, int age, String text) { 26 super(); 27 this.name = name; 28 this.age = age; 29 this.text = text; 30 } 31 }
解析代码如下:
1 package xml; 2 3 import java.io.File; 4 import java.net.URISyntaxException; 5 import java.util.ArrayList; 6 import java.util.Iterator; 7 import java.util.List; 8 9 import org.dom4j.Document; 10 import org.dom4j.DocumentException; 11 import org.dom4j.Element; 12 import org.dom4j.io.SAXReader; 13 14 import bean.People; 15 import bean.Student; 16 import bean.Teacher; 17 18 public class Dom4jParserXML { 19 public static People parseXml(String xmlPath) { 20 File xmlFile = new File(xmlPath); 21 System.out.println(xmlFile.getPath()); 22 23 if (xmlFile.exists()) { 24 SAXReader reader = new SAXReader(); 25 People people = new People(); 26 try { 27 // 读入文档流 28 Document document = reader.read(xmlFile); 29 // 获取根节点 30 Element root = document.getRootElement(); 31 32 List<Student> students = new ArrayList<Student>(); 33 List<Teacher> teachers = new ArrayList<Teacher>(); 34 35 people.setCity(root.attributeValue("city")); 36 // 解析student节点 37 for (Iterator<Element> iterator = root 38 .elementIterator("student"); iterator.hasNext();) { 39 Element eStudent = iterator.next(); 40 String text = eStudent.getText(); 41 42 Student student = new Student( 43 eStudent.attributeValue("name"), 44 Integer.parseInt(eStudent.attributeValue("age")),text); 45 students.add(student); 46 } 47 // 解析teacher节点 48 for (Iterator<Element> iterator = root 49 .elementIterator("teacher"); iterator.hasNext();) { 50 Element eTeacher = iterator.next(); 51 String text = eTeacher.getText(); 52 53 Teacher teacher = new Teacher( 54 eTeacher.attributeValue("name"), 55 Integer.parseInt(eTeacher.attributeValue("age")),text); 56 teachers.add(teacher); 57 } 58 people.setStudent(students); 59 people.setTeacher(teachers); 60 61 System.out.println("Parse success!"); 62 } catch (DocumentException e) { 63 e.printStackTrace(); 64 } 65 return people; 66 } else { 67 System.err.println("File is not exist!"); 68 return null; 69 } 70 } 71 72 public static void main(String[] args) throws URISyntaxException { 73 String xmlPath = "E://xml//people.xml"; 74 System.out.println("File full path is " + xmlPath); 75 // 解析people.xml 76 People p = parseXml(xmlPath); 77 78 // 处理解析结果 79 System.out.println("The city is : " + p.getCity()); 80 List<Student> sList = p.getStudent(); 81 List<Teacher> tList = p.getTeacher(); 82 for (Student s : sList) { 83 System.out.println(s.getName() + "->" + s.getAge() + "->" + s.getResult()); 84 } 85 for (Teacher t : tList) { 86 System.out.println(t.getName() + "->" + t.getAge() + "->" + t.getResult()); 87 } 88 } 89 }
运行结果:
File full path is E://xml//people.xml
E:\xml\people.xml
Parse success!
The city is : BeiJing
Jack->10->My name is Jack!
Lucy->11->My name is Lucy!
James->12->
Jason->25->I am a teacher!
Michael->30->I am a teacher too!