javaee前置知识--xml文件的解析
来源:互联网 发布:催眠是真的吗 知乎 编辑:程序博客网 时间:2024/06/07 18:49
上篇博客说了xml的概述和书写规范,下面介绍一下xml文件时如何解析的。
1、首先我们需要明确xml解析是什么?有什么用?
顾名思义xml解析,就是读取xml的文件信息。它可以从文件中获取对应的配置信息。我们可以通过IO流中的字符流来自己编写程序抽成相关的工具类进行解析。这时候需要自己写算法区分哪个是属性,哪个是元素,哪个是内容体,比较繁琐,使用的频率不高,所以我们使用比较热门的第三方解析工具进行解析。下面简单介绍一下比较出名的解析工具:
常用的解析工具:
1 JAXP:sun公司提供支持DOM和SAX开发包。 开发中基本不用。
2 JDom:dom4j前身。 【后来被dom4j替代】
3 jsoup:一种处理HTML特定解析开发包 作为javaee工程师用不到
4 dom4j:比较常用的解析开发包,hibernate底层采用。 重量级,javaee级解析工具(常用)
5 pull:android内置解析方式。 轻量级解析工具。(极为简化版dom4j)
但是作为javaee工程师在日常工作中的许多xml文件可以被集成好的框架用特定的方法进行解析,比如servlet中就可以利用其中提供的方法获取web.xml文件中的内容
DOM: w3c推荐的官方解析原理方式
标记型文档会从上到下依次加载到内存中,会整体形成一张DOM树。
根元素、节点对象(元素节点对象,属性节点对象,文本节点对象)
DOM解析方式,可以读可以写
其 缺点:
①xml-dom解析器 大小32kb。 xml内容量不能过大。如果xml过大,DOM解析失败
SAX:第三方组织推荐解析方式
只能一行一行读
只能向下读,不能回退读。
读完一行,释放一行的内存资源
几乎不占用内存资源。可以读取大xml文档。
读取方式极快
特点:只能读不能写
所以dom4j中采用了巧妙的方式结合了dom和sax进行解析,用sax解析器读取xml文档, 用dom树接收。 sax解析器解析完毕,sax解析器里面是没有内容。但是dom树已经生成完毕了
3.dom4j解析方式
第一步: 导包
dom4j-1.6.1.jar dom4j核心依赖包
jaxen-1.1-beta-6.jar xpath解析依赖包 快速的解析查询语言
DOM4J 解析方式:
父节点获取子节点,一层一层向下获取,而无法一步到位
-----------------------------------------------------------
DOM4J解析三步:
//1、创建SAX解析器
//2、使用SAX解析器解析XML文件,生成DOM树
//3、使用DOM对象获取根节点
例如:
//dom4j解析三步
//1、创建一个SAX解析器对象
SAXReader reader = new SAXReader();
//2、用SAX解析器解析xml文件,生成dom树
Document dom = reader.read(Demo1.class.getClassLoader().getResourceAsStream("cn\\itheima\\dom4j\\web.xml"));
//3、使用DOM对象 读取根元素的 元素名
Element e = dom.getRootElement();
----------------------------------------------------------------
元素对象:Element
getName(); 返回一个String类型的值, 元素名/标签名
element(String qname); 会返回当前元素下的 对应名称的第一个子元素。
参数qname 就是想要获取子元素的名称
返回值:Element 对象 。 就是对应名称的第一个子元素
elements(String qname); 会返回当前元素下的 对应名称的所有子元素。
参数qname 就是想要获取子元素的名称
返回值:List<Element> 集合 。
getText(); 返回当前元素下的内容体 纯文本
返回值:String
elementText(String qname); 获取当前元素下 对应第一个子元素的内容体文本
参数qname 就是想要获取子元素的名称
返回值:String 子元素的内容体文本
attributeValue(String attributeName); 获取当前元素的 对应属性的值
参数attributeName 就是想要获取的属性名称
返回值:String 属性值
------------------------------
元素对象:Element
selectSingleNode(String xpath); 获取符合要求的第一个元素。
参数xpath:xpath语法字符串
返回值:Node节点对象。 Element继承自Node
selectNodes(String xpath); 获取所有符合要求的元素。
参数xpath:xpath语法字符串
返回值:List<Node>。 Element继承自Node
案例:
<?xml version="1.0" encoding="UTF-8"?><web-app><servlet><servlet-name>Servlet1</servlet-name><servlet-class>com.wt.dom4j.MyServlet1</servlet-class></servlet><servlet-mapping><servlet-name>Servlet1</servlet-name><url-pattern>/s1</url-pattern></servlet-mapping><servlet><servlet-name>Servlet2</servlet-name><servlet-class>com.wt.dom4j.MyServlet.2</servlet-class></servlet><servlet-mapping><servlet-name>Servlet2</servlet-name><url-pattern>/s2</url-pattern></servlet-mapping><servlet><servlet-name>Servlet3</servlet-name><servlet-class>com.wt.dom4j.MyServlet3</servlet-class></servlet><servlet-mapping><servlet-name>Servlet3</servlet-name><url-pattern>/s3</url-pattern></servlet-mapping></web-app>
public void run2() throws Exception {String url = "/s1"; //标签名SAXReader sr = new SAXReader();Document dom = sr.read(Demo1.class.getClassLoader().getResourceAsStream("com\\wt\\dom4j\\web.xml"));Element root = dom.getRootElement(); List<Node> sList = root.selectNodes("servlet");List<Node> smList = root.selectNodes("servlet-mapping");Map<String, String> sMap = new HashMap<>();Map<String, String> smMap = new HashMap<>();for (Node node : sList) {String key = node.selectSingleNode("servlet-name").getText();String value = node.selectSingleNode("servlet-class").getText(); sMap.put(key, value);}for (Node node : smList) {String key = node.selectSingleNode("url-pattern").getText();String value = node.selectSingleNode("servlet-name").getText(); smMap.put(key, value);}String str = sMap.get(smMap.get(url));Class clazz = Class.forName(str);Constructor c = clazz.getConstructor();Object myServlet = c.newInstance();Method init = clazz.getMethod("init");init.invoke(myServlet);Method service = clazz.getMethod("service");service.invoke(myServlet);Method destroy = clazz.getMethod("destroy");destroy.invoke(myServlet);}
public class MyServlet1 {public void init(){System.out.println("1-init()");}public void service(){System.out.println("1-service()");}public void destroy(){System.out.println("1-destroy()");}}
public class MyServlet2 {public void init(){System.out.println("2-init()");}public void service(){System.out.println("2-service()");}public void destroy(){System.out.println("2-destroy()");}}
public class MyServlet3 {public void init(){System.out.println("3-init()");}public void service(){System.out.println("3-service()");}public void destroy(){System.out.println("3-destroy()");}}
- javaee前置知识--xml文件的解析
- javaee前置知识--xml文件的概述和书写规范
- javaee对xml的解析练习
- dom4j解析XML文件 知识要点 良讯
- JavaEE 自学笔记 --XML 解析
- javaee中针对xml的解析方式---DOM
- xml文件的解析
- XML文件的解析
- XML文件的解析
- xml文件的解析
- xml文件的解析
- XML文件的解析
- XML文件的解析
- XML文件的解析
- xml文件的解析
- xml文件的解析
- XML文件的解析
- xml文件的解析
- 并查集通俗易懂的解析
- jsp的常用跳转
- java学习路程
- 【OpenCV】编译OpenCV时,FFmpeg或ippicv下载不成功的解决方案
- php ID前缀格式化类
- javaee前置知识--xml文件的解析
- 使用字符数组
- 第1天:关于程序的3W1H
- Mastering Opencv ch4:SFM详解(三)
- burpsuite插件开发中文API
- Java面试之斐波纳契数列递归与非递归实现
- git 问题:permission denied
- [普及]NOIP 2015 求和
- 编程的一些感悟