解析XML文件
- XML语言简介
什么是XML语言?
可扩展标记语言,标准通用标记语言的子集,(Extensible Markup Language)简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
可扩展:用户可以自定义标签
标记:<>标签,所有标签都写在<>中
XML是HTML语言扩充。
总结HTML语言和XML语言区别:
- HTML超文本标记语言,标签都是预先定义好的,XML语言可扩展标记语言,标签可以自定义。
- 设计目的不同,HTML主要用来显示数据内容;XML语言存储数据和传输数据。
- XML是HTML语言补充。
-
解析XML文件
- 创建XML文件
<?xml version="1.0" encoding="UTF-8"?> <school name="中公教育" address="五方桥基地" > <myclass cname="1008"> <student> <sid>1000</sid> <sname>张三</sname> <sgender>男</sgender> <sage>23</sage> </student> <student> <sid>1001</sid> <sname>李四</sname> <sgender>男</sgender> <sage>24</sage> </student> <student> <sid>1002</sid> <sname>王五</sname> <sgender>男</sgender> <sage>25</sage> </student> </myclass> <myclass cname="1009"> <student> <sid>2000</sid> <sname>小翠</sname> <sgender>女</sgender> <sage>23</sage> </student> <student> <sid>2001</sid> <sname>小红</sname> <sgender>女</sgender> <sage>21</sage> </student> <student> <sid>2002</sid> <sname>小明</sname> <sgender>男</sgender> <sage>22</sage> </student> </myclass> </school> |
XML文件需要注意的问题:
- 根标签只能有一对
- 标签要成对出现
- 标签中属性的值放在双引号中写
- 标签严格区分大小写
- 标签要正确嵌套
2.XML解析(读取)
1).dom4j
a.下载dom4j的jar包并添加到项目中构建路径
b.编写代码解析XML文件
1.创建SAXReader对象
SAXReader reader=new SAXReader();
2.使用SAXReader对象的read()方法加载XML文件,并获取Document文档对象
Document document = reader.read(new FileInputStream("school.xml"));
3.获取根节点,不管是根节点还是子节点,所有节点的类型都是Element类型
Element rootElement = document.getRootElement();
4.获取子节点并循环遍历
List<Element> elements = rootElement.elements();
针对节点操作常用方法:
- 获取节点的属性值
节点对象.attributeValue("属性名");
- 获取节点名
节点对象.getName();
- 获取节点中间的文本信息
节点对象.getText();
特殊方法:通过父节点对象直接获取子点节间的文本信息
父节点对象.elementText(“子节点名”);
案例参考代码:
package com.offcn.dom4j;
import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import com.offcn.entity.Student;
public class TestDom4j { @Test public void test01() { //1.创建SAXReader对象 SAXReader reader=new SAXReader(); try { //2.使用SAXReader对象的read()方法加载XML文件并获取文档对象Document Document document = reader.read(new FileInputStream("school.xml")); //3.*******获取根节点,不管是根节点还是子节点,所有节点的类型都是Element类型 //rootElement---->school Element rootElement = document.getRootElement(); //获取节点的属性值:节点对象.attributeValue("属性名") System.out.println("学校名称:"+rootElement.attributeValue("name")); System.out.println("学校地址:"+rootElement.attributeValue("address")); System.out.println("-------------------------------------------------"); //4.获取并遍历子节点 List<Element> elements = rootElement.elements(); for (Element myclass : elements) { //获取当前班级节点的属性值:班级名称 System.out.println(myclass.attributeValue("cname")); //获取并遍历子节点 List<Element> students = myclass.elements(); for (Element stu : students) { //获取并遍历子节点 List<Element> elms = stu.elements(); for (Element elm : elms) { //获取节点名和值 //System.out.println(elm.getName()+":"+elm.getText()); switch (elm.getName()) { case "sid": System.out.println("学号:"+elm.getText()); break; case "sname": System.out.println("姓名:"+elm.getText()); break; case "sgender": System.out.println("性别:"+elm.getText()); break; case "sage": System.out.println("年龄:"+elm.getText()); break; } } System.out.println(); } System.out.println("*****************************************"); } } catch (Exception e) { e.printStackTrace(); } }
//解析XML文件 public List<Student> loadXml() { List<Student> list=new ArrayList<Student>(); //1.创建SAXReader对象 SAXReader reader=new SAXReader(); try { //2.使用SAXReader对象的read()方法加载XML文件并获取文档对象Document Document document = reader.read(new FileInputStream("school.xml")); //3.*******获取根节点,不管是根节点还是子节点,所有节点的类型都是Element类型 //rootElement---->school Element rootElement = document.getRootElement(); //获取节点的属性值:节点对象.attributeValue("属性名") System.out.println("学校名称:"+rootElement.attributeValue("name")); System.out.println("学校地址:"+rootElement.attributeValue("address")); System.out.println("-------------------------------------------------"); //4.获取并遍历子节点 List<Element> elements = rootElement.elements(); for (Element myclass : elements) { //获取当前班级节点的属性值:班级名称 System.out.println(myclass.attributeValue("cname")); //获取并遍历子节点 List<Element> students = myclass.elements(); for (Element stu : students) { /* * //获取并遍历子节点 List<Element> elms = stu.elements(); for (Element elm : elms) { * //获取节点名和值 //System.out.println(elm.getName()+":"+elm.getText()); switch * (elm.getName()) { case "sid": System.out.println("学号:"+elm.getText()); break; * case "sname": System.out.println("姓名:"+elm.getText()); break; case "sgender": * System.out.println("性别:"+elm.getText()); break; case "sage": * System.out.println("年龄:"+elm.getText()); break; } } */ /* * System.out.println("学号:"+stu.elementText("sid")); * System.out.println("姓名:"+stu.elementText("sname")); * System.out.println("性别:"+stu.elementText("sgender")); * System.out.println("年龄:"+stu.elementText("sage")); */ Student student=new Student(Integer.valueOf(stu.elementText("sid")), stu.elementText("sname"), stu.elementText("sname"), Integer.valueOf(stu.elementText("sage"))); //将封装好的对象添加到集合中 list.add(student); } System.out.println("*****************************************"); } } catch (Exception e) { e.printStackTrace(); } return list; }
@Test public void showStudent() { List<Student> list = loadXml(); for (Student student : list) { System.out.println(student); } } } |
2).xpath:可以直接指定要获取的节点
A.下载xpath的jar包并添加到项目中构建路径
B.编写代码解析xml文件,步骤同dom4j,可以直接指定节点路径
完整参考代码如下:
package com.offcn.dom4j;
import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; import com.offcn.entity.Student; public class TestXPath { // 查询学生的姓名 @Test public void test01() { // 1.创建SAXReader对象 SAXReader reader = new SAXReader(); try { // 2.使用SAXReader对象的read()方法加载XML文件并获取document对象 Document document = reader.read(new FileInputStream("school.xml")); // 3.直接指定要查找的节点路径 List<Element> selectNodes = document.selectNodes("//sname"); // selectNodes----sname // List<Element> selectNodes = // document.selectNodes("/school/myclass/student/sname"); // 4.遍历查找到的节点信息 for (Element element : selectNodes) { System.out.println(element.getName() + ":" + element.getText()); } } catch (Exception e) { e.printStackTrace(); } }
// 查询所有学生的基本信息 @Test public void test02() { List<Student> list=new ArrayList<Student>(); // 1.创建SAXReader对象 SAXReader reader = new SAXReader(); try { // 2.使用SAXReader对象的read()方法加载XML文件并获取document对象 Document document = reader.read(new FileInputStream("school.xml")); // 3.直接指定要查找的节点路径 List<Element> selectNodes = document.selectNodes("//student"); // selectNodes----sname // List<Element> selectNodes = // document.selectNodes("/school/myclass/student/sname"); // 4.遍历查找到的节点信息 for (Element element : selectNodes) { Student student=new Student(Integer.valueOf(element.elementText("sid")), element.elementText("sname"), element.elementText("sgender"), Integer.valueOf(element.elementText("sage"))); list.add(student); } } catch (Exception e) { e.printStackTrace(); } //显示学生信息 for (Student student : list) { System.out.println(student); } } } |
|
注意路径的指定方式:
或