XML的概述,.Dom4解析和SAX解析
1.什么是XML
- XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) 
- XML 是一种标记语言,很类似 HTML 
- XML 的设计宗旨是传输数据,而非显示数据(webservice) 
- XML 标签没有被预定义。您需要自行定义标签。 
- XML 被设计为具有自我描述性。 
- XML 是 W3C 的推荐标准 
- XML可以存储数据(小型数据库) 
- XML可以作为框架的配置问 web.xml applicationContext.xml(spring的配置文件) ,hibernate.cfg.xml 
2.XML与HTML的主要区别
- XML 不是 HTML 的替代。
- XML 和 HTML 为不同的目的而设计:
- XML 被设计为传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
- HTML 旨在显示信息,而 XML 旨在传输信息。
3.XML语法
- XML 标签对大小写敏感
- XML 元素都须有关闭标签<student> </student>
- XML 文档必须有根元素
- XML 的属性值须加引号
4.XML命名规则
XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符 
- 名称不能以数字或者标点符号开始 
- 名称不能以字符 “xml”(或者 XML、Xml)开始 
- 名称不能包含空格 
可使用任何名称,没有保留的字词。
5.特殊字符
| < | "<" | 小于 | 
| > | > | 大于 | 
| & | & | 和号 | 
| ' | ' | 单引号 | 
| " | " | 引号 | 
2.XML解析
文档:

根据xml文件创建对应的类

3.Dom4解析
3.1什么是Dom4j
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的javaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
3.2 核心类
SAXReader Demo4读取文件的类
常用方法:
 read 读取指定的xml文件
Document 文档类 用于加载指定的文档
常用方法:
 getRootElement 获取根节点
Element 标签类,元素
 常用方法:
 elements 获取所有的直接子标签
 attribute 获取指定属性名称的属性对象
 elementText 获取指定子标签名称的文本内容
 element 获取指定标签名称的标签对象
 getText(); 得到当前标签中间的文本
3.3 实现xml解析

4.SAX解析
4.1 什么是SAX
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的代替方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势
dom:把XML文件读取到内容,构建树形结构
4.2 SAX优缺点
- SAX的优点: - 解析速度快 
- 占用内存少 
 
- SAX的缺点: - 无法知道当前解析标签(节点)的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码 
- 只能读取XML,无法修改XML 
- 无法随机访问某个标签(节点) 
 
- SAX解析适用场合 - SAX解析适用场合 对于CPU资源宝贵的设备,如Android等移动设备对于只需从xml读取信息而无需修改xml 
4.3 代码实现
创建自定义处理数据的模板类
继承DefaultHandler类
重新四个方法
startDocument();解析到xml文件的开始
startElement();解析到标签的开头 <book>
endElement(); 解析到标签结尾</book>
character(); 解析到标签中间的文本
代码:
public classMyBookHandler extends DefaultHandler
{/* 声明解析后存储对象的集合*/
private Book book;
private List<Book>books;
private String tagName;//当前解析的标签
public list<Book> getBooks(){
return books;
}
public void startDocument() throws SAXException{
System.out.println("文档的开始");
}
public void endDocument()throws SAXException{
System.out.println("文档的结束");
}
/*解析到标签的开头String qName 解析到的标签的名称<book id="1001">
Attributes attributes 当前这个标签中的属性 id="1001" */
public void startElement (String uri,String localName,String qName,Attributes attributes) throws SAXException{
if("books".equals(qName)){
books=new ArrayList<>();
}else if("book".equals(qName)){
book=new Book();
String ids=attributes.getValue("id");
String date=attributes.getValue("publishdate");
book.setId(Integer.parseInt(ids));
book.setPublishdate(date);
}
tagName=qName;
}
/*解析到标签的结尾
@param uri
@param localName
@param qName
@throws SAXEXception */
public void endElement(String uri,String locatiion,String qName)throws SAXException{
//Sysem.out.println(“标签的结尾”+qName);
tagName=" ";
if("book"equals (qName))
{
book.add(book);
}
/*** 解析到文本
     * @param ch
     * @param start
     * @param length
     * @throws SAXException  */
public void characters(char[] ch, int start, int length) throws SAXException {
        // 把char类型的数组--->string
        String content = new  String(ch,start,length);
        //System.out.println(content);//有可能得到换行符或者空格
        content = content.trim();
        //System.out.println("处理后:"+content+"---标签"+tagName);
        //book.setName(content);
        if ("name".equals(tagName)) {//""
            book.setName(content);
        }else if("author".equals(tagName)) {
            book.setAuthor(content);
        }else if("price".equals(tagName)) {
            //book.setPrice(Double.parseDouble(content));
        }
}
使用SAX进行解析
伪代码:

具体代码:

扩展:DOM解析
dom解析:xml文件加载到内存中,在内存中构建树形结构,文件比较大,不建议使用DOM解析
核心API:
DocumentBuilderFactory
DocumentBuilder
Document xml文档
Node xml文件中的一个节点(标签节点,属性节点,空格或者注释等也是Node对象)
 getNodeName(); 标签名称
 getNodeValue(); 属性值
 getAttributes() ; 得到属性列表
 getTextContent();标签中的文本
NodeList: 子节点列表
Attribute 属性对象


XML的概述,.Dom4解析和SAX解析的更多相关文章
- 经典面试题:一张表区别DOM解析和SAX解析XML
		============DOM解析 vs ... 
- Dom4j解析和sax解析xml
		xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析 3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ... 
- java解析XML之DOM解析和SAX解析(包含CDATA的问题)
		Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ... 
- XML解析(二) SAX解析
		XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ... 
- XML 解析---dom解析和sax解析
		眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ... 
- DOM解析和SAX解析的区别
		DOM解析和SAX解析的区别 博客分类: XML DOM SAX DOM解析和SAX解析的区别 No 区 别 DOM解析 SAX解析 1 操作 将所有文件读取到内存中形成DOM树,如果文件量过大,则 ... 
- java拾遗2----XML解析(二) SAX解析
		XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ... 
- 非常简单的XML解析(SAX解析、pull解析)
		这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ... 
- 解析XML的几种方法之SAX解析
		假期总结不能停,坚持坚持....接下来总结一下XMl和json的解析和生成.. 解析XML的四种方法,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址: DOM:在现 ... 
随机推荐
- echarts饼图字体大小修改
			const option = { tooltip: { trigger: 'item', formatter: "{a} {b}: {c} ({d}%)" }, series: [ ... 
- windows的各种扩展名详解
			Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: 主文件名.扩展名.这样就可以根据文件的扩展名,判定文件的种类,从而知道其 ... 
- HTC新机A9足以取代iPhone 你相信吗?
			你相信吗?" title="HTC新机A9足以取代iPhone 你相信吗?"> 自信和嘴硬之间,往往就是成功与失败的分水岭.乔老爷子当年推出iPhone.iPad等 ... 
- 8——PHP循环结构&&条件结构
			*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ... 
- RocketMQ - 基础知识
			RocketMQ简介 RocketMQ是阿里开源的消息中间件,它是纯java开发,具有低延迟.高吞吐量.高可用性和适合大规模分布式系统应用的特点.从名字可以看出Rocket火箭,代表RocketMQ主 ... 
- 前端每日实战:152# 视频演示如何用纯 CSS 创作一个圆点错觉效果
			效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gBwzKR 可交互视频 此视频是可 ... 
- 说一说 HTML 中的 script 标签
			我们在 <Javascript简史>这遍文章中说过,「Javascript」这门语言是由 Netscape开发而来,当初开发的时候为了能让 「Javascript」这门语言能与 HTML ... 
- 使用MySQL练习增删改查时因为版本问题出现连接错误
			使用MySQL练习增删改查时出现连接错误,错误提示如下: 2020-02-19 19:53:51.088 ERROR 16328 --- [reate-249798694] com.alibaba.d ... 
- springboot连接redis错误 io.lettuce.core.RedisCommandTimeoutException:
			springboot连接redis报错 超时连接不上 可以从以下方面排查 1查看自己的配置文件信息,把超时时间不要设置0毫秒 设置5000毫秒 2redis服务长时间不连接就会休眠,也会连接不上 重 ... 
- 02 HDFS 分布式环境实战
			HDFS的主要设计理念 1.存储超大文件 这里的“超大文件”是指几百MB.GB甚至TB级别的文件. 2.最高效的访问模式是 一次写入.多次读取(流式数据访问)3.运行在普通廉价的服务器上 HDFS设计 ... 
