XML可扩展标记语言

1.概述

1.概念

XML(Extensible Markup Language可拓展标记语言)

2.功能

存储数据,一般用于做配置文件,或者在网络中传输(通常用json文件)

3.XML和HTML区别

  1. xml标签是自定义的,所以需要有约束文件。
  2. xml的语法严格,html语法松散
  3. xml主要用于存储数据,html展示数据

4.语法

  • 文档后缀名xml
  • 第一行<?xml version='1.0' encoding='utf8'?> 是文档声明
  • xml中有且仅有一个根标签
  • 属性值要用(单双)引号引起来
  • 区分大小写

5.快速入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>

<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>

6.主要部分

1.文档声明

1.格式

1
<?xml 属性列表 ?>

2.属性列表

  • version:版本号,一般用1.0
  • encoding:编码方式。
  • standalone:是否独立,yes 或者 no用于表示是否依赖其他文件

2.属性

id值是唯一的

2.约束:规定XML文档的书写诡诈

1.要求

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

2.分类

1.DTD:Document Type Define,简单的文档类型约束技术

1.将约束规则引入xml文件中两种方式

  • 本地:<!DOCTYPE 根标签名 SYSTEM "文件位置">
  • 网络:<!DOCTYPE 根标签名 PUBLIC"文件位置">

2.快速入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8" ?>
<!--从外部引入文档类型定义-->
<!--<!DOCTYPE students SYSTEM "student.dtd">-->
<!--内部定义文档类型定义-->
<!DOCTYPE students [
<!ELEMENT students (student*) > <!--表示students标签下student标签可以无数个-->
<!ELEMENT student (name,age,sex)><!--表示student下标签有name、age、sex-->
<!ELEMENT name (#PCDATA)><!--表示name类型为parse character data类型-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED><!--表示属性列表,student标签的number属性是唯一的(iD),且必须的(REQUIRED)-->
<!ENTITY msg "hello"> <!-- 表示定义一个实体引用,可以直接用msg表示"hello" -->
]>
<students>
<student number="first">
<name>张三</name>
<age>12</age>
<sex></sex>
</student>
<student number="second">
<name>李四&msg;</name>
<age>12</age>
<sex></sex>
</student>


</students>

2.Schema:略微复杂的xml文档约束技术

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8" ?>
<!--
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"


-->

<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
<!--上面表示引入约束文件-->
<!--
第一句表示引入w3cschool定义的命名空间,并且取别名xsi
第三句(先看第三句)表示该xml文件引入本地的xsd约束文件student.xsd(使用w3cschool定义的命名空间xsi下schemaLocation命令),并且用别名http://www.itcast.cn/xml代替
第二句表示命名空间http://www.itcast.cn/xml不在标签前面加前缀,默认是该命名空间如students标签未加前缀就表示该命名空间。

-->
<student number="heima_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>

</students>

3.解析

1.方式

  • DOM

    将标记语言一次性加载进内存形成DOM树。因为比较占内存,所以一般用于PC端

  • SAX

    逐行读取,是基于事件驱动的,一般用于手机端,因为内存小。

2.XML解析器JSOUP

1.快速入门

1.步骤

  1. 导入jsoup的jar包
  2. 获取document对象
  3. 获取标签Element对象
  4. 获取数据

2.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
//3.获取元素对象 Element
Elements elements = document.getElementsByTag("name");

System.out.println(elements.size());
//3.1获取第一个name的Element对象
Element element = elements.get(0);
//3.2获取数据
String name = element.text();
System.out.println(name);

2.主要对象使用

1.Document

Jsoup静态方法parsexml文件获取

2.Element

通过getElementByxx获取,下面也会介绍快捷的方式select获取xpath获取

3.获取属性值

String attr(String key)

4.获取文本

  • string text()
  • string html()

3.快捷查询1selector

  • select(String cssQuery),就是css中定位元素的方法
  • 参考文档中的Selector类中的方法

4.快捷查询2xpath

  • 需要导入xpath对应的jar包

  • new JXDocument对象,参数为jsoup获取的document对象

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    //1.获取student.xml的path
    String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
    //2.获取Document对象
    Document document = Jsoup.parse(new File(path), "utf-8");

    //3.根据document对象,创建JXDocument对象
    JXDocument jxDocument = new JXDocument(document);

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

    System.out.println("--------------------");

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

    System.out.println("--------------------");

    //4.3查询student标签下带有id属性的name标签
    List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
    for (JXNode jxNode : jxNodes3) {
    System.out.println(jxNode);
    }
    System.out.println("--------------------");
    //4.4查询student标签下带有id属性的name标签 并且id属性值为itcast

    List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
    for (JXNode jxNode : jxNodes4) {
    System.out.println(jxNode);
    }