XML解析
解析XML的步骤:
* 1、创建SAXReader
* 2、创建File对象来描述文件
* 3、使用SAXReader读取文件(解析的过程)
* 并返回Document对象,其封装了整棵树
* 4、通过Document获取根元素(根标签)
* 5、根据XML的结构获取不同节点预计对应的信息
XML解析方式
1. SAX解析方式
SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。
而且相比于DOM,SAX可以在解析文档的任意时刻停止解析。
其优缺点分别为:
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改
2. DOM解析方式
DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。DOM解析器在解析XML文档时,会把文档中的所有元素,
按照其出现的层次关系,解析成一个个Node对象(节点)。
其优缺点分别为:
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长
读取XML
1. SAXReader读取XML文档
使用SAXReader需要导入dom4j-full.jar包。其是DOM4J的一个核心API,用于读取XML文档。
DOM4J是一个Java的XML API,类似于JDOM,用来读写XML文件的。DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
我们使用了SAXReader读取了一个指定的文件,那么调用的方法是:
Document reader(File file)
该方法会读取给定的文件,并将其封装到一个名为Document的对象中。
2. Document的getRootElement方法
Document 对象是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。
当我们得到Document后就相当于我们得到了XML描述的整个树结构。那么我们就来开始解析的第一步工作,获取根元素。
获取根元素前,我们还需要提一下一个名为Element的类。
Element用于描述XML中的一个元素。元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。
Document的方法:
Element getRootElement()
用来获取当前XML文档中的根元素。
Element
1. element方法
当我们通过解析XML得到一个Element对象时,如何获取该对象所表示的元素的一些相关信息呢?
其中Element提供了一个方法:
Element element(String name)
该方法用于获取当前元素下指定名字的子元素。
若当前元素下包含若干个同名子元素,那么element方法会获取该元素中第一个子元素。
若我们希望获取当前元素下所有同名的子元素,我们可以使用elements方法。
2. elements方法
Element提供了另一个方法用于获取当前元素下所有子元素,其方法为:
List elements()
elements还有重载方法,比如我们希望获取当前元素下同名的所有子元素时,我们可以使用:
List elements(String name)
该方法会获取当前元素下所有给定名字的子元素。
3. getName方法
Element提供了一个方法,用于获取当前元素的名字:
String getName()
4. getText方法
Element还提供了一个方法,用于获取元素的文本节点(其实标记与结束标记之间的文本)
String getText()
5. attribute方法
Element的attribute方法用于获取当前元素的属性信息,其方法定义为:
Attribute attribute(int index)
获取当前元素的指定属性,index为索引,从0开始。
Attribute attribute(String name)
获取当前元素的指定名字的属性。
Attribute
1. getName方法和getValue方法
Attribute类的每一个实例用于描述一个元素中的某个属性信息。根据该对象我们通常会获取其对应的属性名与属性值的信息,这两个信息的获取依靠下列方法:
String getName() : 获取属性的名字
String getValue() : 获取属性的值
/** * 测试attribute方法 */ public static void testAttribute(Element element){ //获取当前元素的第一个属性 Attribute attr = element.attribute(0); System.out.println(attr.getName()); System.out.println(attr.getValue()); }
/** * 测试使用DOM解析xml */ public class TestReadXml { public static void main(String[] args) { try { //导入org.dom4j.* SAXReader reader =new SAXReader(); //java.io.File File xmlFile =new File("emp.xml"); /* * 解析xml 返回对应的Document对象 * 该对象封装了xml文档中所有的内容 */ Document doc =reader.read(xmlFile); /* * 获取根标签(xml中的List标签) */ Element root = doc.getRootElement(); /* * 获取根标签(根元素)下的所有子标签(子元素) * 获取所有的 */ List<Element> elements =root.elements(); /* * 获取当前标签下所有名字为emp的子标签 */ //List<Element> elements =root.elements(emp); //遍历所有子标签emp for(Element element:elements){ System.out.println("标签:"+element.getName()); //获取emp标签的ID属性值 Attribute attribute =element.attribute("id"); //获取该属性的值(id属性的值) int id =Integer.parseInt(attribute.getValue()); System.out.println("员工ID:"+id); //获取emp标签中的name标签 Element nameEle =element.element("name"); /*getText() 方法用于获取前标记和后标记之间的文本 * <name>张三</name> * 若nameEle 描述的是name标签 * 则nameEle.getText() 方法获取的事字符串 张三 * 调用该方法应确保name标签中是文本信息 */ String name =nameEle.getText(); System.out.println("员工名字:"+name); /* * 获取年龄 * 我们希望获取emp标签中的子标签age中的文本 * 两种方式: * 1.先获取age标签 在获取其中的文本 这个和上面获取name的方法一致 * 2.字节调用elementText()方法 * 例如:element.elementText("age") * 可以获取当前标签(emp)中名为age的标签中的文本 * 这种写法更简洁 */ int age =Integer.parseInt(element.elementText("age")); System.out.println("员工年龄:"+age); //获取性别 String gender =element.elementText("gender"); System.out.println("员工性别:"+gender); //获取工资 int salary =Integer.parseInt(element.elementText("salary")); System.out.println("员工工资"+salary); } } catch (Exception e) { } } }
1 /** 2 * 该类用来描述XML文件中一个员工的信息 3 * 这种设计方式要习惯 4 * 对于一个表格保存的所有数据而言,有多少列(字段) 5 * 我们这里就对应定义相应类型的属性 6 * 这样我们可以用该类的每一个实例保存表格中每一行数据 7 * @author Administrator 8 *vo : value object 9 */ 10 class Emp{ 11 private int id; 12 private String name; 13 private int age; 14 private String gender; 15 private int salary ; 16 public Emp(int id, String name, int age, String gender, int salary) { 17 super(); 18 this.id = id; 19 this.name = name; 20 this.age = age; 21 this.gender = gender; 22 this.salary = salary; 23 } 24 public int getId() { 25 return id; 26 } 27 public void setId(int id) { 28 this.id = id; 29 } 30 public String getName() { 31 return name; 32 } 33 public void setName(String name) { 34 this.name = name; 35 } 36 public int getAge() { 37 return age; 38 } 39 public void setAge(int age) { 40 this.age = age; 41 } 42 public String getGender() { 43 return gender; 44 } 45 public void setGender(String gender) { 46 this.gender = gender; 47 } 48 public int getSalary() { 49 return salary; 50 } 51 public void setSalary(int salary) { 52 this.salary = salary; 53 } 54 @Override 55 public String toString() { 56 return "Emp [id=" + id + ", name=" + name + ", age=" + age 57 + ", gender=" + gender + ", salary=" + salary + "]"; 58 } 59 60 }
/** * 根据给定的xml文件名将该xml文件中的所有员工信息 * 存入一个List集合中并返回 * @author Administrator * */ class XmlUtil { private static String xmlFileName; public static List<Emp> main(String[] args) { List<Emp> list =new ArrayList<Emp>(); try { /* * 解析XML的步骤: * 1、创建SAXReader * 2、创建File对象来描述文件 * 3、使用SAXReader读取文件(解析的过程) * 并返回Document对象,其封装了整棵树 * 4、通过Document获取根元素(根标签) * 5、根据XML的结构获取不同节点预计对应的信息 */ SAXReader reader =new SAXReader(); File file =new File(xmlFileName); Document document =reader.read(file); Element root =document.getRootElement(); //5 List<Element> elements =root.elements(); //遍历每一个emp标签 for(Element empEle:elements){ int id =Integer.parseInt(empEle.attribute("id").getValue()); String name = empEle.elementText("name"); } } catch (Exception e) { e.printStackTrace(); } return list; } }