【JAVAEE基础学习(4)】--简述XML篇

一、基本知识:
    1.概念:
        Extensible Markup Language 可扩展标记语言
            可扩展:标签都是自定义的。

    2.功能:
        存储数据(而且这些数据具有自我描述性)
            1.配置文件
            2.在网络中传输数据(现在 JSON 为主)。

    3.XML与HTML的区别
        1.xml中的标签是自定义的,html标签是预定义的
        2.html语法松散,xml的语法严格
        3.xml是存储数据的,html是展示数据的

tip:w3c:万维网联盟

二、语法:
    1.基本语法:
        1.xml文档的后缀名 .xml
        2.xml第一行必须定义为文档声明

{
            <?xml version="1.0" encoding="UTF-8" ?>
}

        3.xml中有且仅有一个根标签,剩下的是元素(标签)
            xml文档必须有根元素
                根元素就是顶级元素,
                没有父标签的元素,叫顶级元素。
                根元素是没有父标签的顶级元素,而且是唯一一个才行。
        4.属性值必须用引号(单双都可以)引起来
        5.标签必须正确关闭:要么自闭和,要么围堵
        6.xml标签名称严格区分大小写
        7.xml必须正确地嵌套
        8.xml注释html和XML注释一样:<!-- html 注释 -->
        9.文本区域(CDATA 区)
            CDATA语法可以告诉xml解析器:CDATA里的文本内容,只是纯文本,不需要xml语法解析
                CDATA 格式:

<![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>


    2.快速入门:
        实例一:

{
    <?xml version="1.0" encoding="UTF-8" ?>
    <users>
        <user id="1">
            <name>zhangsan</name>
            <age>18</age>
            <gender>male</gender>
        </user>
        <user id="2">
            <name>zhaoliu</name>
            <age>23</age>
            <gender>female</gender>
        </user>
    </users>
}

        实例二:

{
    <?xml version="1.0" encoding="utf-8" ?>
    <!--
        以上就是xml的声明
        version="1.0"  表示xml的版本
        encoding="utf-8" 表示xml本身的编码
    -->

    <books><!--books 表示多个图书信息-->
        <book sn="SN647823567"><!--book表示一个信息 sn表示图书序列号-->
            <name>时间简史</name><!--图书名字-->
            <author>霍金</author><!--作者-->
            <price>75</price><!--价格-->
        </book>

        <book sn="SN647823561"><!--book表示一个信息 sn表示图书序列号-->
            <name>格林童话</name><!--图书名字-->
            <author>安徒生</author><!--作者-->
            <price>60</price><!--价格-->
        </book>
    </books>
}

    3.组成部分:
        1.文档声明(必须声明在第一行)

{
    1.格式:<?xml version="1.0" encoding="UTF-8" ?>
        说明:<?xml 属性列表 ?>
    2.属性列表:
        version:版本号,必须属性
        encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
        standalone:是否独立,参数分别为yes{不依赖其他文件}和no{依赖其他文件}
}

        2.指令:结合css

 <?xml-stylesheet type="text/css" href="a.css" ?>

        3.标签:标签名称自定义的
            规则:              
                1.名称可以含字母、数字以及其他的字符
                2.名称不能以数字或者标点符号开始
                3.名称不能以字符 “xml”(或者 XML、Xml)开始
                4.名称不能包含空格
                5.xml 中的元素(标签)也分成单标签和双标签:
                    单标签格式:
                        <标签名 属性=”值” 属性=”值” ...... />
                    双标签格式:
                        < 标签名 属性=”值” 属性=”值” ......>文本数据或子标签</标签名>

        4.属性:
            id属性值为一
            xml的标签属性和html的标签属性是非常类似的,属性可以提供元素的额外信息
                在标签上可以书写属性:
                    一个标签上可以书写多个属性。
                    每个属性的值必须使用引号引起来。
                    的规则和标签的书写规则一致。
            1)属性必须使用引号引起来,不引会报错示例代码

        5.文本
            CDATA区:在该区域的数据会被原样展示
            格式:<![CDATA[ 数据 ]]>
    4.约束:
        1.概念:规定xml文档的书写规则
        2.背景:
            用户(程序开发者)和软件半成品(框架)在进行交互开发时需要通过xml来进行数据交流,而xml的书写规则需要由框架编写者规定,则框架编写者对xml的规定即xml的约束
        3.要求:
            作为框架的使用者(程序的开发者):
                1.能够在xml中引入约束文档
                2.能够简单读懂约束文档
        4.分类:
            1.DTD:一种简单的约束技术(对标签内容的数据(如数据类型等)不进行限定)
                1.引入dtd文档到xml文档中

引入格式{
    1.内部dtd:将约束规则定义在xml文档中
    2.外部dtd:将约束规则定义在外部的dtd文件中{
        本地引入:
            <!DOCTYPE students SYSTEM "student.dtd">
            <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
        网络引入:
            <!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置URL">
    }
}


            2.Schema:一种复杂的约束技术
                1.引入
                    1.填写xml文档的根元素
                    2.引入xsi前缀

{
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    固定写法
}

                    3.引入xsd文件命名空间

{
    xsi:schemaLocation="http://www.lixxkv.cn/xml  student.xsd"
    xsi:schemaLocation="命名空间 路径"
}

                    4.为每一个xsd约束声明一个前缀,作为标识

{
    xmlns="http://www.lixxkv.cn/xml"
    xmlns=命名空间
    xmlns:a=命名空间1
    xmlns:b=命名空间2
}

                实例一

<students  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.lixxkv.cn/xml"
    xsi:schemaLocation="http://www.lixxkv.cn/xml  student.xsd">

    内容。。。

</students>

                实例二

<a:students  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.lixxkv.cn/xml"
    xsi:schemaLocation="http://www.lixxkv.cn/xml  student.xsd">

    带a内容。。。
    
</a:students>

三、解析:
    1.背景:
        xml可扩展的标记语言。
            不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析document对象表示的是整个文档(可以是html文档,也可以是xml文档)早期JDK为我们提供了两种xml解析技术DOM和Sax简介(已经过时,但我们需要知道这两种技术)dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析标记也做了实现。sun公司在JDK5版本对dom解析技术进行升级:SAX(Simple API for XML)SAX解析,它跟W3C制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。它是一行一行的读取xml文件进行解析的。不会创建大量的dom对象。所以它在解析xml的时候,在内存的使用上。和性能上。都优于Dom解析。

        第三方的解析:
            jdom 在 dom 基础上进行了封装 、 dom4j 又对 jdom 进行了封装。 pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。

            这个 Dom4j 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。

    2.概念:
        操纵xml文档,将文档中的数据读取到内存中
            操纵xml文档:
                1.解析(读取):将文档中标的数据读取到内存中
                2.写入:将内存中的数据保存到xml文档中。持久化存储
    
    3.解析xml的方式:
        1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
            优点:操作方便,可以对文档进行CRUD的所有操作
            缺点:占内存
            常用于服务器端
        2.SAX:逐行读取(读一行释放一行),基于事件驱动的。
            优点:不占内存。
            缺点:只能读取,不能增删改
            常用于客户端

    4.xml常见的解析器:
        1.JAXP:SUN公司提供的解析器,支持dom和sax两种思想
        2.DOM4J:一款分厂优秀的解析器
        3.Jsoup:
            jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。
            它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
        4.PULL:Android操作系统内置的解析器,sax方式的。

四、Jsoup 解析技术:
    1.快速入门:
        步骤:
            1. 导入jar包
            2. 获取Document对象
            3. 获取对应的标签Element对象
            4. 获取数据
    2.对象的使用:
        1. Jsoup:工具类,可以解析html或xml文档,返回Document
            parse:解析html或xml文档,返回Document
                parse:(File in, String charsetName):解析xml或html文件的。
                parse:(String html):解析xml或html字符串
                parse:(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象

        2. Document:文档对象。代表内存中的dom树
            获取Element对象
                getElementById:(String id):根据id属性值获取唯一的element对象
                getElementsByTag:(String tagName):根据标签名称获取元素对象集合
                getElementsByAttribute:(String key):根据属性名称获取元素对象集合
                getElementsByAttributeValue:(String key, String value):根据对应的属性名和属性值获取元素对象集合

        3. Elements:元素Element对象的集合。可以当做 ArrayList<Element>来使用

        4. Element:元素对象
            1. 获取子元素对象
                getElementById:(String id):根据id属性值获取唯一的element对象
                getElementsByTag:(String tagName):根据标签名称获取元素对象集合
                getElementsByAttribute:(String key):根据属性名称获取元素对象集合
                getElementsByAttributeValue:(String key, String value):根据对应的属性名和属性值获取元素对象集合

            2. 获取属性值
                String attr(String key):根据属性名称获取属性值
            3. 获取文本内容
                String text():获取所有子标签的纯文本内容
                String html():获取标签体的所有内容(包括字标签的字符串内容)
        5. Node:节点对象
            是Document和Element的父类

        
    3.快捷查询方式:
        1. selector:选择器
            使用的方法:Elements  select:(String cssQuery)
                语法:参考Selector类中定义的语法
        2. XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
            使用Jsoup的Xpath需要额外导入jar包。
            查询w3cshool参考手册,使用xpath的语法完成查询

五、dom4j 解析技术
    由于 dom4j 它不是 sun 公司的技术,而属于第三方公司的技术。
    需要使用 dom4j 就需要到 dom4j 官网下载 dom4j 的 jar 包。

    1、Dom4j 类库的使用

    2、dom4j 编程步骤:
        第一步:先加载xml文件创建Document对象
        第二步:通过Document对象拿到根元素对象
        第三步:通过根元素.elelemts(标签名);可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
        第四步:找到你想要修改、删除的子元素,进行相应在的操作
        第五步:保存到硬盘上

    3、获取 document 对象
        解析获取 Document 对象的代码
            先创建 SaxReader 对象。这个对象,用于读取 xml 文件,并创建 Document

    4、遍历 标签 获取所有标签中的内容
        需要分四步操作:
            第一步,通过创建 SAXReader 对象。来读取 xml 文件,获取 Document 对象
            第二步,通过 Document 对象。拿到 XML 的根元素对象
            第三步,通过根元素对象。获取所有的 book 标签对象
            第四步,遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,再通过 getText() 方法拿到起始标签和结 束标签之间的文本内容六、实例分析:       

1、创建一个books.xml文件用于临时保存数据

{
    <?xml version="1.0" encoding="utf-8" ?>
    <!--
        以上就是xml的声明
        version="1.0"  表示xml的版本
        encoding="utf-8" 表示xml本身的编码
    -->

    <books><!--books 表示多个图书信息-->
        <book sn="SN647823567"><!--book表示一个信息 sn表示图书序列号-->
            <name>时间简史</name><!--图书名字-->
            <author>霍金</author><!--作者-->
            <price>75</price><!--价格-->
        </book>

        <book sn="SN647823561"><!--book表示一个信息 sn表示图书序列号-->
            <name>格林童话</name><!--图书名字-->
            <author>安徒生</author><!--作者-->
            <price>60</price><!--价格-->
        </book>

    </books>
}

2、根据books.xml创建相应的javaBean

{
    public class B0P4PBook {
        private String sn;
        private String name;
        private String author;
        private double price;

        public B0P4PBook() {
        }

        public B0P4PBook(String sn, String name, String author, double price) {
            this.sn = sn;
            this.name = name;
            this.author = author;
            this.price = price;
        }


        public String getSn() {
            return sn;
        }

        public void setSn(String sn) {
            this.sn = sn;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }

        public double getPrice() {
            return price;
        }

        public void setPrice(double price) {
            this.price = price;
        }

        @Override
        public String toString() {
            return "Book{" +
                    "sn='" + sn + '\'' +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    '}';
        }
    }
}

3、读取books.xml生成book类

{
    @Test
    public void test01(){
        /*
            1.读取books.xml文件
            2.通过Document对象获取根元素
            3.通过根元素获取book标签对象
            4.遍历,处理每个book标签转化为book类
         */
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read("src/basepart000/part004/XML/books00.xml");
            Element rootElement = document.getRootElement();
    //            System.out.println(rootElement);
            //element()和elements()都是通过标签名查找子元素
            List<Element> books = rootElement.elements("book");
            for (Element book : books) {
                //asXML()把标签对象转化为标签字符串
    //                System.out.println(book.asXML());
                Element nameElement = book.element("name");
    //                System.out.println(nameElement.asXML());
                //getText();可以获取标签中的文本内容
                String nameText = nameElement.getText();
    //                System.out.println(nameText);

                //elementText();直接获取指定标签名的文本内容
                String priceText = book.elementText("price");
                String author = book.elementText("author");
                String snValue = book.attributeValue("sn");

                System.out.println(new B0P4PBook(snValue,nameText,author,Double.parseDouble(priceText)));
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

以上是本篇小节,不喜勿喷,感谢理解

相关链接:

【JAVAEE基础学习(5)】--简述TomCat篇_lixxkv的博客-CSDN博客


版权声明:本文为qq_55865959原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。