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的优点:

    1. 解析速度快

    2. 占用内存少

  • SAX的缺点:

    1. 无法知道当前解析标签(节点)的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码

    2. 只能读取XML,无法修改XML

    3. 无法随机访问某个标签(节点)

  • 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解析的更多相关文章

  1. 经典面试题:一张表区别DOM解析和SAX解析XML

                                                                                 ============DOM解析    vs ...

  2. Dom4j解析和sax解析xml

    xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析  3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...

  3. java解析XML之DOM解析和SAX解析(包含CDATA的问题)

    Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...

  4. XML解析(二) SAX解析

    XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...

  5. XML 解析---dom解析和sax解析

    眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...

  6. DOM解析和SAX解析的区别

    DOM解析和SAX解析的区别 博客分类: XML DOM SAX  DOM解析和SAX解析的区别 No 区 别 DOM解析 SAX解析 1 操作 将所有文件读取到内存中形成DOM树,如果文件量过大,则 ...

  7. java拾遗2----XML解析(二) SAX解析

    XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...

  8. 非常简单的XML解析(SAX解析、pull解析)

    这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...

  9. 解析XML的几种方法之SAX解析

    假期总结不能停,坚持坚持....接下来总结一下XMl和json的解析和生成.. 解析XML的四种方法,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址: DOM:在现 ...

随机推荐

  1. javasc-正则表达式

    匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff]评注:可以用来计算字符串的长度 ...

  2. js new 与 return

    前置: 默认情况下, 函数的返回值是 undefined (即没有定义返回值). new 操作符 js 中的 new 操作符,可以是我们像 java 一样,获得一个新的对象,例如: function ...

  3. React中key的讲解

    通过阅读React的文档我们知道React这个框架的核心思想是,将页面分割成一个个组件,一个组件还可能嵌套更小的组件,每个组件有自己的数据(属性/状态);当某个组件的数据发生变化时,更新该组件部分的视 ...

  4. 每天一个linux命令(15)-tail

    tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新, ...

  5. Java8-19-lambda 重构代码

    通过本书的前七章,我们了解了Lambda和Stream API的强大威力. 你可能主要在新项目的代码中使用这些特性.如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用 ...

  6. 海洋深处的数据中心——微软Natick项目

    数据中心(data center)是云计算的支柱,云计算的蓬勃发展离不开数据中心在建造运营方面的不断创新.但云端数据中心的运行过程中会产生大量热量,冷却降温过程则意味着巨大的能源消耗,这意味着需要庞大 ...

  7. python常用魔术方法概览

    构造和初始化 __init__(self, args) 构造函数 __new__(cls) 传入的是类实例 __del__(self) 析构函数,调用 del cls 时会被调用 属性访问控制 __g ...

  8. Docker Swarm和Kubernetes在大规模集群中的性能比较

    Contents 这篇文章主要针对Docker Swarm和Kubernetes在大规模部署的条件下的3个问题展开讨论.在大规模部署下,它们的性能如何?它们是否可以被批量操作?需要采取何种措施来支持他 ...

  9. POI之下载模板(或各种文件)

    该例基于Nutz框架 前台代码: <a href="" id="errordownload" onclick="downloadErrorLog ...

  10. 等效燃油消耗ECMS与庞德里亚金最小值原理PMP中协同状态的关系

    今儿阅读了一篇文献——<车联网环境下并联混合动力客车控制策略优化研究>,是北理的博士所写的,内容比较翔实.主要是里面的关于ECMS和庞德里亚金最小值原理(PMP)的关系推导很让人印象深刻, ...