XML学习笔记

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML学习笔记相关的知识,希望对你有一定的参考价值。

目录

1. XML概念

1.1 可扩展

1.2 功能

1.3 xml与html的区别

1.4 xml与properties的区别

2. 语法

2.1 基本语法

2.2 快速入门

2.3 组成部分

2.3.1 文档声明

2.3.2 指令

2.3.3 标签

2.3.4 属性

2.3.5 文本

2.3.6 约束

3. 解析xml

3.1 操作xml文档

3.2 解析xml的方式

3.3 xml常见的解析器

3.4 Jsoup

3.4.1 Jsoup概述

3.4.2 Jsoup快速入门

3.4.3 Jsoup对象的使用

3.4.4 快捷查询方式

4. 扩展

4.1 XML实例应用

4.1.1 通过properties配置数据库连接信息

4.1.2 通过xml配置数据库连接信息

4.2 知识扩展

4.3 本节源码


1. XML概念

xml:是一种可扩展标记语言。

1.1 可扩展

指xml的标签都是自定义的。如<student>、<name>等。

1.2 功能

xml文件现在是用来存储数据的,以前是用来展示数据的。

应用:

  • 用作配置文件,例如SSM框架的配置文件就是xml。
  • 在网络种传输,例如前后端交互传数据就可以使用xml格式(不过现在使用较多的是json格式)。

1.3 xml与html的区别

之所以拿来比较,是因为二者都具有类似的标签,都是DOM树状结构。

主要区别:

  • 1. xml标签都是自定义的(即程序员自定义的,如<student>、<name>等),html标签是预定义(即w3c联盟规定的标签,如<html>、<input>等)。
  • 2. xml的语法严格(即必须要有结束标记,如<name></name>),html语法松散(即可以省略</p>或</li>这样的结束标记)。
  • 3. xml是存储数据的,html是展示数据。

其他区别:

  • 1. xml严格区分大小写,html不区分大小写。
  • 2. xml种属性值必须放在双引号或单引号种,html可用可不用的。
  • 3. xml种所有属性必须有相应的属性值,html可以拥有不带值的属性名。
  • 4. xml中空白部分不会被解析器自动删除,html会过滤掉空格。

1.4 xml与properties的区别

之所以拿来比较,是因为二者都可以存储数据,都可以作为配置文件使用。

主要区别:

  • xml配置文件是树状结构,可以配置各种情况,而properties文件是每一行就是一个键值对(key = value)。
  • xml结构更加清晰也更为复杂,而properties文件结构简单。
  • xml文件更加灵活,可以配置各种情况,而properties文件以键值对形式存在,主要是赋值操作。
  • xml文件配置繁琐,使用也需要专门的解析器才能获取到有效的信息,而properties使用更加便捷,直接通过getProperty(key)或setProperty(key, value)即可使用。
  • xml适用于需求复杂,比较大型的项目,而properties文件适用于小型比较简单的项目。

二者的应用举例:如配置JDBC连接数据库的信息就可以使用properties文件,而SSM框架的配置文件使用的就是xml文件。

 


 

2. 语法

2.1 基本语法

基本语法如下:

  • 1. xml文档的后缀名 .xml
  • 2. xml第一行必须定义为文档声明<?xml version='1.0' ?>必须在第一行
  • 3. xml文档中有且仅有一个根标签
  • 4. 属性值必须使用引号(单双都可)引起来,如<user id="1"></user>
  • 5. 标签必须正确关闭,即必须有结束标记,如<user></user>而不能是<user>
  • 6. xml标签名称区分大小写,html标签不区分大小写

2.2 快速入门

<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1">
        <name>张三</name>
        <age>12</age>
        <sex>f</sex>
    </user>
    <user id="2">
        <name>李四</name>
        <age>122</age>
        <sex>m</sex>
    </user>
</users>

如:

可以用浏览器来查看该xml结构

2.3 组成部分

2.3.1 文档声明

格式:

<?xml 属性列表 ?>

例如:

<?xml version="1.0" encoding="UTF-8" ?>
<!--尖括号与问号之间不能有空格-->

其中的属性列表有如下几个:

  • version:版本号,必须的属性,否则会报错
  • encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1,可以设置encoding='gbk'或encoding='utf-8'才能解析中文,高级的开发工具会自动识别如IDEA。
  • standalone:是否独立,即是否依赖其他文件,该属性了解即可。取值如下:
    • yes:不依赖其他文件
    • no:依赖其他文件

2.3.2 指令

该概念了解即可。

结合css的,因为早期是用来展示数据的,现在几乎不使用了,因为有html专门用来展示。

如下所示,给user.xml引入一行

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

其中user.css为如下:

打开浏览器查看该user.xml会发现字体有了不同的颜色

2.3.3 标签

标签就是<user></user>这种的,其中的名称程序员自定义的。

但名称还是有些规则的:

  • 名称可以包含字母、数字以及其他的字符。
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

2.3.4 属性

如<user id="1"></user>这样的,其中id是属性,id属性值唯一。

并且属性值必须用单引号或双引号引起来。

2.3.5 文本

如<sex>f</sex>中的"f"就是文本,即标签中包括的文本,可以是中文、英文、数字等。

但如果要显示特殊的字符,如一段代码,可能就不会成功

当然可以使用html特殊字符来处理

但可能难以记忆和阅读,所以xml提供了一种语法来处理这种特殊字符的情况,即:

CDATA区:在该区域中的数据会被原样展示(因为特殊字符如'<'需要转义才能展示)

格式如下:

<![CDATA[ 数据 ]]>

例如:

2.3.6 约束

1. 约束是什么?

  • 约束:规定xml文档的书写规则(作用,比如说颜色必须写<color>标签)

2. 为什么要写约束?

  • xml文件是需要被软件解析的,但xml文件是程序员编写的,在软件解析xml文件的时候并不知道xml里面有些什么标签,有些什么属性,所以需要一种约束来规定它们(例如我们在xml中设置了颜色用<color></color>,但解析器不知道,就不能解析了,所以需要一个桥梁来沟通解析器与xml,让它们之间达成一种共识)。

3. 作为框架(如SSM框架)的使用者(程序员)的要求?

  • 1. 能够在xml中引入约束文档
  • 2. 能够简单的读懂约束文档

4. 常见约束有哪几种分类呢?

  • DTD: 一种简单的约束技术
  • Schema: 一种复杂的约束技术

5. DTD介绍

这里只简单介绍DTD该如何引入,具体的书写规则请参考:DTD教程

  • 引入dtd文档到xml文档中
    • 内部dtd:将约束规则定义在xml文档中,不通用,了解即可
    • 外部dtd:将约束的规则定义在外部的dtd文件中,常用
      • 本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
      • 网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

内部dtd的例子:

外部dtd-本地的例子:

6. Schema

这里只简单介绍Schema该如何引入,具体的书写规则请参考:Schema教程

  • Schema引入
    • 1.填写xml文档的根元素
    • 2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    •  3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
    • 4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml"

例如spring-mvc的引入配置:

 


 

3. 解析xml

解析xml:即是操作xml文档,将文档中的数据读取到内存中。

3.1 操作xml文档

操作xml文档有两种情况:读取和写入。

  • 解析(读取):将文档中的数据读取到内存中
  • 写入:将内存中的数据保存到xml文档中。持久化的存储,即保存到数据库等。

3.2 解析xml的方式

解析xml有两种思想:

  1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树。一般web端使用。
    • 优点:操作方便,可以对文档进行CRUD(即增删改查)的所有操作
    • 缺点:DOM树由于一次性加载,所以可能占内存
  2. SAX:逐行读取,基于事件驱动的。一般移动端使用。
    • 优点:不占内存。
    • 缺点:只能读取,不能增删改

3.3 xml常见的解析器

能够解析xml的解析器,常见的有以下几种:

  • JAXP:sun公司提供的解析器,支持dom和sax两种思想,性能较差,使用较少
  • DOM4J:一款非常优秀的解析器
  • Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
  • PULL:android操作系统内置的解析器,sax方式的。

3.4 Jsoup

这里主要说明jsoup的使用。

3.4.1 Jsoup概述

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup还可以用作爬虫,其简单操作请参考:Jsoup入门教程

3.4.2 Jsoup快速入门

步骤如下:

  • 1. 导入jar包(或使用maven坐标)
  • 2. 获取Document对象
  • 3. 获取对应的标签Element对象
  • 4. 获取数据

代码如下:

user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1">
        <name>张三</name>
        <age>12</age>
        <sex>f</sex>
    </user>
    <user id="2">
        <name>李四</name>
        <age>122</age>
        <sex>m</sex>
    </user>
</users>

JsoupDemo1.java

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        // 1.获取user.xml路径
        String path = JsoupDemo1.class.getClassLoader().getResource("user.xml").getPath();
        // 2.解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3.获取元素对象Element
        Elements elements = document.getElementsByTag("users");
        // 4.打印结果
        System.out.println(elements);
    }
}

就会打印整个user.xml文档内容在控制台。

3.4.3 Jsoup对象的使用

1. 查看官方文档文档

可以查看文档

接着用浏览器打开index.html

就可以看到官方文档了

2. Document对象

即文档对象。代表内存中的dom树。

其中该对象最重要的是获取Element对象。

常用的方法有:

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

代码实例:

public class JsoupDemo2 {
    public static void main(String[] args) throws IOException {
        // 1.获取user.xml路径
        String path = JsoupDemo2.class.getClassLoader().getResource("user.xml").getPath();
        // 2.解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");

        // 2.1根据id属性值获取唯一的element对象
        Element elementById = document.getElementById("2");
        System.out.println(elementById);
        System.out.println("------------------------------------------");

        // 2.2 根据标签名称获取元素对象集合
        Elements elementsByTag = document.getElementsByTag("age");
        System.out.println(elementsByTag);
        System.out.println("------------------------------------------");

        // 2.3 根据属性名称获取元素对象集合
        Elements elementsByAttribute = document.getElementsByAttribute("id");
        System.out.println(elementsByAttribute);
        System.out.println("------------------------------------------");

        // 2.4 根据对应的属性名和属性值获取元素对象集合
        Elements elementsByAttributeValue = document.getElementsByAttributeValue("id", "1");
        System.out.println(elementsByAttributeValue);
    }
}

3. Elements对象

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

4. Element对象

该对象可以作如下操作:

  • 获取子元素对象,有如下方法:
    • getElementById​(String id):根据id属性值获取唯一的element对象
    • getElementsByTag​(String tagName):根据标签名称获取元素对象集合
    • getElementsByAttribute​(String key):根据属性名称获取元素对象集合
    • getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合
  • 获取属性值,有如下方法:
    • String attr(String key):根据属性名称获取属性值
  • 获取文本内容,有如下方法:
    • String text():获取文本内容
    • String html():获取标签体的所有内容(包括字标签的字符串内容)

代码实例:

public class JsoupDemo3 {
    public static void main(String[] args) throws IOException {
        // 1.获取user.xml路径
        String path = JsoupDemo3.class.getClassLoader().getResource("user.xml").getPath();
        // 2.解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3. 通过id属性值获取唯一的元素对象
        Element element = document.getElementById("1");

        // 3.1 获取属性值
        String id = element.attr("id");
        System.out.println(id);
        System.out.println("------------------------------------------");

        // 3.2 获取文本内容
        String text = element.text();
        System.out.println(text);
        System.out.println("------------------------------------------");

        // 3.3 获取包括html标签在内的所有内容
        String html = element.html();
        System.out.println(html);
    }
}
/**
 * 打印结果:
 * 1
 * ------------------------------------------
 * 张三 12 f
 * ------------------------------------------
 * <name>
 *  张三
 * </name> 
 * <age>
 *  12
 * </age> 
 * <sex>
 *  f
 * </sex>
 */

5. Node对象

是Document和Element的父类。

3.4.4 快捷查询方式

上面要查某个标签的信息,要写比较多的代码,操作繁琐,所以产生了下面的快捷查询方式:CSS选择器和Xpath查询。

1. CSS选择器

语法格式:

Elements.select​(String cssQuery)
// Elements是查询出来的Elements对象
// cssQuery是参数,指CSS选择器

使用方法(查阅文档):

(注:文档位置在:...\\jsoup-1.11.2-javadoc\\org\\jsoup\\select\\Selector.html)

代码实例:

public class JsoupDemo4 {
    public static void main(String[] args) throws IOException {
        // 1.获取user.xml路径
        String path = JsoupDemo3.class.getClassLoader().getResource("user.xml").getPath();
        // 2.解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3.获取Elements对象
        Elements users = document.getElementsByTag("users");

        // 3.1 根据id来获取
        Elements elements_id = users.select("#1");
        System.out.println(elements_id);
        System.out.println("------------------------------------------");

        // 3.2 根据属性名来获取
        Elements elements_attr = users.select("[id]");
        System.out.println(elements_attr);
        System.out.println("------------------------------------------");

        // 3.3 根据属性值来匹配
        Elements elements_attr_val = users.select("[id='2']");
        System.out.println(elements_attr_val);
        System.out.println("------------------------------------------");

        // 3.4 获取子元素
        Elements elements_child = users.select("user > name");
        System.out.println(elements_child);
    }
}

2. Xpath

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。

使用Jsoup的Xpath需要额外导入jar包。

关于xpath语法请参考:XPath教程

代码实例:

public class JsoupDemo5 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        // 1.获取user.xml路径
        String path = JsoupDemo3.class.getClassLoader().getResource("user.xml").getPath();
        // 2.解析xml文档,加载文档进内存,获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3.根据document对象,创建JXDocument对象
        JXDocument jxDocument=new JXDocument(document);

        // 4.结合xpath语法查询
        // 4.1 查询所有user标签
        List<JXNode> jxNodes1 = jxDocument.selN("//user");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode.getElement());
        }
        System.out.println("------------------------------------------");

        // 4.2 查询所有user标签下的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//user/name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode.getElement());
        }
        System.out.println("------------------------------------------");

        // 4.3 查询users标签下带有id属性的user标签
        List<JXNode> jxNodes3 = jxDocument.selN("//users/user[@id]");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode.getElement());
        }
        System.out.println("------------------------------------------");

        // 4.4 询users标签下带有id属性的user标签,并且id属性值为"1"
        List<JXNode> jxNodes4 = jxDocument.selN("//users/user[@id='2']");
        for (JXNode jxNode : jxNodes4) {
            System.out.println(jxNode.getElement());
        }
    }
}

 


 

4. 扩展

4.1 XML实例应用

下面以加载数据库连接信息为例,来演示下简单使用。

4.1.1 通过properties配置数据库连接信息

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

GetConnectionByProp.java

public class GetConnectionByProp {
    public static void main(String[] args) throws IOException {
        // 1.获取properties文件路径
        String path = GetConnectionByProp.class.getClassLoader().getResource("extend/properties/jdbc.properties").getPath();
        // 2.实例化Properties对象并加载配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream(new File(path)));
        // 3.提取参数
        String driver = properties.getProperty("jdbc.driver");
        String url = properties.getProperty("jdbc.url");
        String username = properties.getProperty("jdbc.username");
        String password = properties.getProperty("jdbc.password");
        // 4.打印结果(同样,这里不连接数据库)
        System.out.println(driver + "\\n" + url + "\\n" + username + "\\n" + password);
    }
}
/**
 * 打印结果:
 * com.mysql.jdbc.Driver
 * jdbc:mysql://localhost:3306/test
 * root
 * root
 */

4.1.2 通过xml配置数据库连接信息

database.xml

<?xml version="1.0" encoding="UTF-8" ?>
<jdbc>
    <driver>com.mysql.jdbc.Driver</driver>
    <url>jdbc:mysql://localhost:3306/test</url>
    <username>root</username>
    <password>root</password>
</jdbc>

 GetConnectionByXml.java

public class GetConnectionByXml {
    public static void main(String[] args) throws IOException {
        // 1.获取database.xml的路径
        String path = GetConnectionByXml.class.getClassLoader().getResource("extend/xml/database.xml").getPath();
        // 2.加载xml文件得到Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3.获取Elements元素对象
        Elements jdbc = document.getElementsByTag("jdbc");
        // 4.获取参数
        String driver = jdbc.select("driver").text();
        String url = jdbc.select("url").text();
        String username = jdbc.select("username").text();
        String password = jdbc.select("password").text();
        // 5.打印结果(这里就不连接数据库了)
        System.out.println(driver + "\\n" + url + "\\n" + username + "\\n" + password);
    }
}
/**
 * 打印结果:
 * com.mysql.jdbc.Driver
 * jdbc:mysql://localhost:3306/test
 * root
 * root
 */

这只是简单应用,一般情况下,我们都是使用别人的框架(如SSM)直接在xml中配置,而不是写这种松散的xml文件。

4.2 知识扩展

本节说明的是xml的使用,但在本节中应用到了很多相关的知识。

其学习教程地址如下:

4.3 本节源码

本节源码地址:Xml的使用

以上是关于XML学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

android学习笔记34——ClipDrawable资源

关于读取XML文件代码学习笔记

XXE外部实体注入(XML External Entity Injection)学习笔记

DOM探索之基础详解——学习笔记

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

学习笔记 链接