皮皮网

皮皮网

【快乐牛牛完整源码】【jetcd源码分析】【多开框架源码】sax源码分析

时间:2024-12-26 14:45:06 分类:综合

1.源码详解系列(三) --dom4j的码分使用和分析(重点对比和DOM、SAX的码分区别)
2.java的xml的解析方式有什么,他们的码分解析流程是怎么样的,有什么区别
3.xml sax localName和qName的区别

sax源码分析

源码详解系列(三) --dom4j的码分使用和分析(重点对比和DOM、SAX的码分区别)

       dom4j是用于读写XML的工具,其API相比JDK的码分快乐牛牛完整源码JAXP更易用,在国内受到欢迎。码分本文将详细说明如何使用dom4j并分析其源码,码分同时对比DOM和SAX解析方法。码分

       DOM和SAX是码分读取XML节点的方法,DOM在内存中构建整个XML树,码分便于查找节点;SAX则是码分jetcd源码分析边读取边处理节点,不构建树,码分性能更高但不支持随机访问。码分DOM适合大型XML文件,码分SAX适合大文件或不支持随机访问的场景。

       本文首先介绍了使用dom4j的项目环境,包括JDK版本、Maven版本、IDE以及dom4j版本。Maven依赖应为Maven Project类型,打包方式为jar,并注意引入jaxen jar包以支持XPath。多开框架源码

       接着,文章描述了使用dom4j编写XML的需求,并详细说明了如何使用dom4j写XML和读XML,强调了dom4j在节点操作上的优势。使用XPath获取指定节点部分,文章介绍了XPath的基本语法,帮助用户实现直接通过路径找到节点的功能。

       源码分析部分,文章解释了dom4j如何将XML元素抽象为具体对象,构建树形数据结构,并分析了读取XML节点的bot缓存源码过程,指出dom4j直接调用了JAXP SAX API,继承了JAXP的实现。

       最后,文章对比了dom4j与JAXP的优缺点,从易用性、性能和代码解耦性进行分析。在易用性上,dom4j的API更为简洁;性能方面,JAXP DOM在读取时稍快,而dom4j在写入时表现更优;代码解耦性上,使用JAXP更符合项目中代码重用和易维护的go隐藏源码原则。

       综上,作者推荐直接使用JAXP而不是dom4j,因为JAXP在项目中使用更为广泛,可以减少代码改动,确保更好的兼容性和扩展性。尽管dom4j在某些方面更为简便,但在考虑项目长远发展和维护时,选择JAXP更为合理。文章末尾感谢读者阅读并鼓励提供反馈。

java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别

       答:4种。(或者说是两种,因为JDOM和DOM4J是DOM的两个特殊情况)

       1.SAX解析

        解析方式是事件驱动机制!

        SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始/结束/内容/属性时,触发事件。

        可以在这些事件发生时,编写程序进行相应的处理。

        优点:

        分析能够立即开始,而不是等待所有的数据被处理。

        逐行加载,节省内存,有助于解析大于系统内存的文档。

        有时不必解析整个文档,它可以在某个条件得到满足时停止解析。

        缺点:

        1.单向解析,无法定位文档层次,无法同时访问同一个文档的不同部分数据(因为逐行解析,当解析第n行时,第n-1行)已经被释放了,无法再对其进行操作)。

        2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系。

        3. 只读解析方式, 无法修改XML文档的内容。

       2. DOM解析

       是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个 文档和内存中建立文档树模型。程序员可以通过操作文档树, 来完成数据的获取 修改 删除等。

        优点:

        文档在内存中加载, 允许对数据和结构做出更改。访问是双向的,可以在任何时候在树中双向解析数据。

        缺点:

        文档全部加载在内存中 , 消耗资源大。

       3. JDOM解析

        目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。

        JDOM文档声明其目的是“使用%(或更少)的精力解决%(或更多)Java/XML问题” (根据学习曲线假定为%)

        优点:

        使用具体类而不是接口,简化了DOM的API。

        大量使用了Java集合类,方便了Java开发人员。

        缺点:

        没有较好的灵活性。

        性能不是那么优异。

       4. DOM4J解析

        它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。

        目前许多开源项目中大量采用DOM4J , 例如:Hibernate。

xml sax localName和qName的区别

       1. xml中的localName和QName

       [html] view plaincopy

       <?xml version="1.0" encoding="utf-8"?>

       <websites

        xmlns:sina=""

        xmlns:baidu="">

        <sina:website sina:blog="blog.sina.com">新浪</sina:website>

        <baidu:website baidu:blog="hi.baidu.com">百度</baidu:website>

       </websites>

       Namespace(空间名称,命名空间)

       å¼•å…¥çš„原因是为了避免混淆。例如上面的这个XML文档,sina和baidu都有blog属性,定义了两个namespace,就像sax官网说的,用namespace是为了实现更多的扩展功能,作为基本应用,很多时候都用不到它:

       sina的namespace:

       baidu的namespace:

       [html] view plaincopy

       xmlns:sina=""

       xmlns:baidu="">

       namespace的值可以任意,但是注意不要重复。一般默认的格式都是以url来作为namespace,比如

       xmlns:android="/apk/res/android。

       Prefix(前缀)

       sina:blog中 sina就是前缀。

       LocalName(本地名称)

       sina:blog 中blog就是localName。

       QName(Qualified Name 限定?指定?名称)

       sina:blog就是QName,相当于前缀+":"+LocalName。

       uri(不是url哈)

       ä¾‹å¦‚sina:blog的uri就是前缀sina的namespace,即""。

       2.sax解析localName与qName

       sax simple API for XML,现在有两个版本,sax和sax2。

       sax不支持LocalName、QName和uri。对于属性sina:blog="blog.sina.com",sax解析的结果是LocalName=QName="sina:blog",uri="",value="blog.sina.com"。

       sax2支持LocalName、QName、uri。对于属性sina:blog="blog.sina.com",sax2解析的结果是

       LocalName="blog",QName="sina:blog",uri="",value="blog.sina.com"。

       æµ‹è¯•ï¼š

       TestSax.java

       [java] view plaincopy

       package com.siqi.xml;

       import java.io.File;

       import java.io.FileReader;

       import javax.xml.parsers.SAXParser;

       import javax.xml.parsers.SAXParserFactory;

       import org.xml.sax.InputSource;

       import org.xml.sax.XMLReader;

       import org.xml.sax.helpers.XMLReaderFactory;

       public class TestSax {

        public static void main(String... args) {

        try {

        //Sax2解析XML文档

        System.out.println("parse xml file use sax2");

        SaxParseHandler sax2Handler = new SaxParseHandler();

        XMLReader xmlReader = XMLReaderFactory.createXMLReader();

        xmlReader.setContentHandler(sax2Handler);

        xmlReader.setErrorHandler(sax2Handler);

        FileReader fileReader = new FileReader("./src/sample.xml");

        xmlReader.parse(new InputSource(fileReader));

        //sax1解析XML文档

        System.out.println("parse xml file use sax");

        SaxParseHandler saxHandler = new SaxParseHandler();

        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

        File file = new File("./src/sample.xml");

        parser.parse(file, saxHandler);

        } catch (Exception e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        }

       }

       SaxParseHandler.java

       [java] view plaincopy

       package com.siqi.xml;

       import org.xml.sax.Attributes;

       import org.xml.sax.SAXException;

       import org.xml.sax.helpers.DefaultHandler;

       /**

        * 要用sax解析,需要实现一个ParseHandler

        * @author siqi

        *

        */

       public class SaxParseHandler extends DefaultHandler{

        /**

        * 重写了DefaultHandler中的startElement函数,每解析到

        * 一个元素(element)的时候都会触发这个函数,并且将这个element

        * 的属性attributes和值value当作参数传进来。除了startElement,

        * 还有startDocument,endDOucment,endElement,要根据需要

        * 重写这些函数。

        */

        @Override

        public void startElement(String uri, String localName, String qName,

        Attributes attributes) throws SAXException {

        //打印element的基本信息,qName

        System.out.println("Element qName : "+qName);

        System.out.println("Element localName: "+localName);

        System.out.println("Element uri : "+uri);

        //打印element的所有属性attributes

        for(int i=0; i<attributes.getLength(); i++) {

        System.out.println("");

        System.out.println(" attribute qName : "+attributes.getQName(i));

        System.out.println(" attribute localName: "+attributes.getLocalName(i));

        System.out.println(" attribute value : "+attributes.getValue(i));

        System.out.println(" attribute uri : "+attributes.getURI(i));

        }

        System.out.println("");

        super.startElement(uri, localName, qName, attributes);

        }

       }

       sample.xml的内容最上面那个xml

       æ‰§è¡Œç»“果:

       [html] view plaincopy

       parse xml file use sax2

       Element qName : websites

       Element localName: websites

       Element uri :

       Element qName : sina:website

       Element localName: website

       Element uri :

        attribute qName : sina:blog

        attribute localName: blog

        attribute value : blog.sina.com

        attribute uri :

       Element qName : baidu:website

       Element localName: website

       Element uri :

        attribute qName : baidu:blog

        attribute localName: blog

        attribute value : hi.baidu.com

        attribute uri :

       parse xml file use sax

       Element qName : websites

       Element localName:

       Element uri :

        attribute qName : xmlns:sina

        attribute localName: xmlns:sina

        attribute value :

        attribute uri :

        attribute qName : xmlns:baidu

        attribute localName: xmlns:baidu

        attribute value :

        attribute uri :

       Element qName : sina:website

       Element localName:

       Element uri :

        attribute qName : sina:blog

        attribute localName: sina:blog

        attribute value : blog.sina.com

        attribute uri :

       Element qName : baidu:website

       Element localName:

       Element uri :

        attribute qName : baidu:blog

        attribute localName: baidu:blog

        attribute value : hi.baidu.com

        attribute uri :

       å¯¹äºŽsax2,正确的解析出了qName,LocalName和uri。sax不能识别出前缀和uri,qName=localName。

       3.android xml dom4j

       åœ¨android程序中,我在用dom4j来操作XML文档的时候发现一个问题,用dom4j解析出来的文档attribute名称都是一样的。

       ä¾‹xml为:

       [html] view plaincopy

       <?xml version="1.0"?>

       <root xmlns="http://www.w3.org//XMLSchema">

        <element name="Jim" age="" score=""></element>

       </root>

       åœ¨è§£æžçš„时候解析出来的内容为

       [html] view plaincopy

       <?xml version="1.0"?>

       <root xmlns="http://www.w3.org//XMLSchema">

        <element name="Jim" name="" name=""></element>

       </root>

       äºŽæ˜¯æˆ‘开始看dom4j的源代码,在android上dom4j获取到的qName是空字符。通过查看callStack发现android上用的saxparser和PC上saxparser不一样,正在进一步研究中..