一、DOM简介
1. 什么是DOM ?
- 用于 XML 的标准对象模型
- 用于 XML 的标准编程接口
- 中立于平台和语言
- W3C 标准
XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法(接口)。
换句话来说:XML DOM 是用于获取、更改、添加或删除 XML 元素的标准。
2. 节点
根据 DOM,XML 文档中的每个成分都是一个节点。
- 整个文档是一个文档节点
- 每个 XML 元素是一个元素节点
- 包含在 XML 元素中的文本是文本节点
- 每一个 XML 属性是一个属性节点
DOM实例:
<?xml version="1.0" encoding="UTF-8"?> <students> <student sid="s001"> <name>小明</name> </student> <student sid="s002"> <name>小芳</name> </student> <student sid='s003'> <name>小王</name> </student> </students>
在上面的 XML 中,根节点是 <students>。文档中的所有其他节点都被包含在 <students> 中。
根节点 <students> 有三个 <student> 节点,同时<student>节点有个属性节点sid="s002 "。
第一个 <student> 节点有一个节点:<name>其中每个节点都包含一个文本节点,"小明"。
二、XML解析
1. XML配置文件的三种读取方式
1.1 同包情况下
package com.xml.dom; import java.io.InputStream; import java.util.Properties; /** * 读取不同位置的的配置文件(1) * * @author 云村小威 * */ public class Demo1 { public static void main(String[] args) throws Exception { // 通过类加载器加载配置文件(同包) InputStream stream = Demo1.class.getResourceAsStream("db.properties"); Properties p = new Properties(); //用于读取配置文件 //从输入流读取数据 p.load(stream); System.out.println(p.getProperty("uname")); } }
1.2 不同包情况下
package com.xml.dom; import java.io.InputStream; import java.util.Properties; /** * 读取不同位置的的配置文件(2) * * @author 云村小威 * */ public class Demo1 { public static void main(String[] args) throws Exception { // 通过类加载器加载配置文件(不同包根路径下) InputStream stream = Demo1.class.getResourceAsStream("/db.properties"); Properties p = new Properties(); // 用于读取配置文件 // 从输入流读取数据 p.load(stream); System.out.println(p.getProperty("uname")); } }
1.3 WEB-INF安全路径下
package com.xml.dom; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author 云村小威 */ @WebServlet("/WEB_INF_Servlet") public class WEB_INF_Servlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取WEB-INF安全路径 ServletContext context = request.getServletContext(); InputStream stream = context.getResourceAsStream("/WEB-INF/db.properties"); Properties p = new Properties();//Properties类用于读取配置文件 // 从输入流读取数据 p.load(stream); System.out.println(p.getProperty("uname")); } }
2. DOM4J的使用
2.1 dom4j常用的方法
selectNodes | 获取某一节点(集合) |
selectSingleNodes | 获取单个节点 |
getText | 获取某一标签的内容 |
attributeValue | 获取某一标签属性的值 |
2.2 dom4j 使用实例
以一下xml文件在同包情况下为例:
<?xml version="1.0" encoding="UTF-8"?> <students> <student sid="s001"> <name>小黑子</name> </student> <student sid="s002"> <name>ikun</name> </student> <student sid='s003'> <name>纯路人</name> </student> </students>
1.selectNodes 获取某一个节点集合
package com.xml.dom; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 获取xml文件中内容DOM4J解析 * 1.selectNodes 获取某一个节点集合 * * @author 云村小威 * */ public class Demo3 { public static void main(String[] args) throws Exception { // 获取需要解析的配置文件(同包) InputStream stream = Demo3.class.getResourceAsStream("students.xml"); // 实例化DOM4J核心类 SAXReader sr = new SAXReader(); // 读取流对象 Document read = sr.read(stream); // 根据document对象获取xml文件所有内容 // System.out.println(read.asXML()); // 1.获取某一个标签 List<Element> nodes = read.selectNodes("/students/student"); for (Element element : nodes) { System.out.println(element.asXML()); } } }
2.selectSingleNodes 获取到单个节点
package com.xml.dom; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 获取xml文件中内容DOM4J解析 * 2.selectSingleNodes 获取到单个节点 * * @author 云村小威 * */ public class Demo3 { public static void main(String[] args) throws Exception { // 获取需要解析的配置文件(同包) InputStream stream = Demo3.class.getResourceAsStream("students.xml"); // 实例化DOM4J核心类 SAXReader sr = new SAXReader(); // 读取流对象 Document read = sr.read(stream); // 根据document对象获取xml文件所有内容 // System.out.println(read.asXML()); List<Element> nodes = read.selectNodes("/students/student"); for (Element element : nodes) { // 2.获取单个节点 Element ele = (Element) element.selectSingleNode("name"); System.out.println(ele.asXML()); } } }
3.getText 获取某一个标签内容
System.out.println(ele.getText());
4.attributeValue 获取某一个标签的属性
package com.xml.dom; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 获取xml文件中内容DOM4J解析 * 4.attributeValue 获取某一个标签的属性 * * @author 云村小威 * */ public class Demo3 { public static void main(String[] args) throws Exception { // 获取需要解析的配置文件(同包) InputStream stream = Demo3.class.getResourceAsStream("students.xml"); // 实例化DOM4J核心类 SAXReader sr = new SAXReader(); // 读取流对象 Document read = sr.read(stream); // 根据document对象获取xml文件所有内容 // System.out.println(read.asXML()); List<Element> nodes = read.selectNodes("/students/student"); for (Element element : nodes) { //4.attributeValue 获取某一个标签的属性 System.out.println(element.attributeValue("sid")); } } }
3. XPath的使用
package com.xml.dom; import java.io.InputStream; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * xpath解析方式 * * @author 云村小威 * */ public class Demo3 { public static void main(String[] args) throws Exception { // 获取需要解析的配置文件(同包) InputStream in = Demo2.class.getResourceAsStream("students.xml"); // 实例化DOM4J核心类 SAXReader sr = new SAXReader(); // 读取流对象 Document read2 = sr.read(in); Element ele2 = (Element) read2.selectSingleNode("/students/student[@sid='s002']/name"); System.out.println(ele2.getText()); } }