zoukankan      html  css  js  c++  java
  • 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的优点:

      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 属性对象

     

  • 相关阅读:
    java中的注解
    jQuery中的pushStack
    jenkins+maven+svn构建项目,及远程部署war包到tomcat上
    mysql中的find_in_set的使用
    svn的使用总结
    poi导出excel,以字符串格式输出数字
    eclipse中在整个工程中查找一个字符串的步骤
    Android Service学习
    Android生成签名文件
    开源移动医疗应用框架:mHealhDroid及APP
  • 原文地址:https://www.cnblogs.com/wanghuaying/p/9538528.html
Copyright © 2011-2022 走看看