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文件中的内容

2、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()");}}


0 0
原创粉丝点击