前言
最近考试周忙得要死,但我却不紧不慢,还有三天复习时间,考试科目几乎都还没学呢。今天更新一个算是工具类-XML文件的解析,感觉还是挺有用的,之后可以融进自己的项目里。
XML 配置文件解析
0、导入依赖
有点像我之前爬虫学的 Jsoup 一样,只不过 Jsoup 可以用来解析 HTML,这个是解析 XML。
<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.1</version> </dependency>
1、配置文件的两种读取方式
1.1、从同级目录读取
语法:
类名.class.getResourceAsStream("配置文件名")
案例:
编写一个数据库配置文件,放到和读取类同级的目录下:
username=root password=123456 url=jdbc:mysql://localhost:3306/test driver_Class5=com.mysql.jdbc.Driver driver_Class8=com.mysql.cj.jdbc.Driver
读取:
public static void readCurrentDir(String propertyName) throws IOException { // todo 加载同级目录下的配置文件 // 1. 加载配置文件,返回输入流 (底层是通过类加载器) InputStream in = XMLParser.class.getResourceAsStream("db.properties"); // 2. 实例化 Properties 工具类 Properties p = new Properties(); // 3. 调用 load 方法加载输入流 p.load(in); // 通过 getProperty 方法输出配置文件中指定key的内容 System.out.println("username: "+p.getProperty("username")); System.out.println("password: "+p.getProperty("password")); }
2、从根目录下(resources)读取
继续把上面的配置文件放到 resources 目录下:
public static void readFromResources() throws IOException { // todo 加载同级目录下的配置文件 // 1. 加载配置文件,返回输入流 (底层是通过类加载器) InputStream in = XMLParser.class.getResourceAsStream("/db.properties"); // 2. 实例化 Properties 工具类 Properties p = new Properties(); // 3. 调用 load 方法加载输入流 p.load(in); // 通过 getProperty 方法输出配置文件中指定key的内容 System.out.println("username: "+p.getProperty("username")); System.out.println("password: "+p.getProperty("password")); }
DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
2、XML 文件的解析
有了上面的铺垫,我们就可以把不同位置的 XML 文件都读取进来了,接下来介绍常用的简单解析方法。
Dom4j 解析过程
- 创建SAXReader对象。
- 调用SAXReader对象的 read() 方法,将XML文件读入内存,并返回一个Document对象。
- 通过Document对象的 getRootElement() 方法获取XML文件中的根节点(是一个 Element 对象)。
- 通过根节点的静态方法 elements() 获得一个子节点集合。
- 遍历根节点的所有子节点,获取需要的元素节点及其属性和文本内容。
打印 xml 文件内容的语法:
InputStream in = XMLParser.class.getResourceAsStream("/books.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(in); System.out.println(doc.asXML());
下面案例用到的 XML 文件。
<bookstore> <book category="love"> <title lang="en">黄金时代</title> <author>王小波</author> <year>1991</year> <price>30.00</price> </book> </bookstore>
2.1、获取标签内容
public static void dom4j_forEach() throws DocumentException { InputStream in = XMLParser.class.getResourceAsStream("/books.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(in); Element root = doc.getRootElement(); List<Element> books = root.elements(); for (Element book : books) { System.out.println("category: "+book.elementText("category")); System.out.println("title: "+book.elementText("title")); System.out.println("author: "+book.elementText("author")); } }
2.2、添加一个子标签
public static void dom4j_addSubNode() throws DocumentException { InputStream in = XMLParser.class.getResourceAsStream("/books.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(in); Element root = doc.getRootElement(); List<Element> books = root.elements(); for (Element book : books) { Element publish = book.addElement("publish"); publish.addAttribute("name","publishTime"); publish.setText("2003"); } System.out.println(doc.asXML()); }
后面用到的时候有什么新用法在来更新吧。