JavaWeb复习(一):XML
Java Web复习第一弹 XML相关知识
一、XML概念
XML即为Extensible Markup Language
,可扩展标记语言
1.1 可扩展
XML中所有标签均可以自定义。
如<haha> </haha>
, <bilibili> </bilibili>
2.2 XML功能
XML最重要的功能就是持久化(存储)数据,用来当各种框架的配置文件
XML常用于
- 配置文件
- 在网络中传输
2.3 XML和HTML的区别
xml和html均是由w3c(万维网联盟)所制定的标记语言,xml晚于html,w3c期望xml可以取代html,然而并没有成功。
区别:
XML | HTML | |
---|---|---|
标签 | 自定义 | 由w3c标准预定义 |
语法 | 严格的 | 松散 |
用途 | 存储数据 | 展示数据 |
二、XML语法
2.1 基本语法
- xml文档的后缀名 .xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- xml标签名称区分大小写
2.2 一个简单XML文件
<!--
文件名:Demo01.xml,本篇代码均会用到此文件
-->
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="1">
<name>konley</name>
<age>18</age>
</user>
<user id="2">
<name>mike</name>
<age>12</age>
</user>
</users>
2.3 组成部分
- 文档声明
- 格式:
<?xml 属性列表 ?>
- 例子
<?xml version=1.0 encoding=utf-8?>
- 例子
- 属性列表:各个属性用空格分隔开
version
:版本号,必须的属性,目前只有1.0encoding
:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1standalone
:是否独立,比较少用- 取值:
- yes:不依赖其他文件
- no:依赖其他文件
- 格式:
- 指令(了解):结合css
<?xml-stylesheet type="text/css" href="a.css" ?>
- 标签:标签名称自定义的
- 规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
- 属性:id属性值唯一
- 文本:了解
- CDATA区:在该区域中的数据会被原样展示而不需要用转义字符
- 格式:
<![CDATA[ 数据 ]]>
- 格式:
2.4 约束
概念
约束:规定xml文档的书写规则
作为框架的使用者,应该拥有以下技能
- 能够在xml中引入约束文档
- 能够简单读懂约束文档
DTD约束
一种简单的约束技术
-
内部dtd:将约束规则定义在xml文档中
-
外部dtd:将约束的规则定义在外部的dtd文件中
* 本地:```xml <!DOCTYPE 根标签名 SYSTEM "dtd文件的位置"> ```
-
网络:
<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
-
代码示范
<!--dtudent.dtd-->
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
<!--引入dtd-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="itcast_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
Schema约束
引入步骤
1.填写xml文档的根元素
2.引入xsi前缀
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间
xsi:schemaLocation="http://www.xx.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识
xmlns="http://www.xx.cn/xml"
代码示范
<!--student.xsd-->
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.xx.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="s_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
<!--student.xml-->
<?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.xx.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.xx.cn/xml"
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.xx.cn/xml"
xsi:schemaLocation="http://www.xx.cn/xml student.xsd"
>
<student number="s_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
三、Jsoup解析器
3.1 解析
操作xml文档,将文档中的数据读取到内存中
-
操作xml文档
1. 解析(读取):将文档中的数据读取到内存中- 写入:将内存中的数据保存到xml文档中。持久化的存储
-
解析xml的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- SAX:逐行读取,基于事件驱动的。
- 优点:不占内存。
- 缺点:只能读取,不能增删改
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
-
xml常见的解析器:
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML、XML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,sax方式的。
3.2 Jsoup快速入门
- 步骤:
1. 导入jar包,jsoup-1.11.2.jar
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
/**
* @author konley
* @date 2020-07-08 21:34
* 使用Jsoup读取xml
*/
public class Demo02Jsoup {
public static void main(String[] args) throws IOException {
/*
1. 获取Dcoument对象,根据xml文档来获取
*/
//获取路径,得到File对象
String path = Demo02Jsoup.class.getClassLoader().getResource("XML/Demo01.xml").getPath();
File file = new File(path);
//解析xml,得到Document对象,
Document document = Jsoup.parse(file,"UTF-8");
/*
2. 获取元素,返回Elements对象(看成element集合)
*/
//获取标签为name的元素
Elements elements = document.getElementsByTag("name");
//操作name
System.out.println("集合长度为:"+elements.size());
//取出第一个name封装为element对象
Element element = elements.get(0);
//取出值
String text = element.text();
System.out.println("elements(0)的值为:"+text);
}
}
3.3 Jsoup工具类的使用
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的文档对象 |
代码示范
/**
* @author konley
* @date 2020-07-09 8:44
* Jsoup对象功能
*/
public class Demo03Jsoup {
public static void main(String[] args) throws IOException {
String path = Demo03Jsoup.class.getClassLoader().getResource("XML/Demo01.xml").getPath();
File in = new File(path);
/*
1. 直接从xml、html文件读取,打印树形结构
*/
Document document = Jsoup.parse(in, "UTF-8");
System.out.println(document);
/*
2. 解析xml或者html字符串,打印树形结构
*/
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
"<users>\n" +
" <user id=\"1\">\n" +
" <name>konley</name>\n" +
" <age>18</age>\n" +
" </user>\n" +
"\n" +
" <user id=\"2\">\n" +
" <name>mike</name>\n" +
" <age>12</age>\n" +
" </user>\n" +
"</users>";
document = Jsoup.parse(str);
System.out.println(document);
/*
3. parse(URL url,int timeoutMillis):通过网络路径获取指定html或xml文档对象
*/
URL url = new URL("http://1jumao.cn/index.php/archives/839/");
document = Jsoup.parse(url,10000);
System.out.println(document);
}
}
3.4 Doucment 对象
文档对象。代表内存中的dom树
主要功能:获取Element、Elements对象
方法(操作XML) | 作用 |
---|---|
getElementById(String id) | 根据id属性值获取唯一的element对象 |
getElementsByTag(String tagName) | 根据标签名称获取元素对象集合 |
getElementsByAttribute(String key) | 根据属性名称获取元素对象集合 |
getElementsByAttributeValue(String key, String value) | 根据对应的属性名和属性值获取元素对象集合 |
代码示范
/**
* @author konley
* @date 2020-07-09 9:16
* Document/Element对象功能
*/
public class Demo04Document {
public static void main(String[] args) throws IOException {
String path = Demo04Document.class.getClassLoader().getResource("XML/Demo01.xml").getPath();
File file = new File(path);
Document document = Jsoup.parse(file, "utf-8");
/*
1.获取所有的user标签的对象
*/
Elements user = document.getElementsByTag("user");
System.out.println(user);
System.out.println("====================");
/*
2.获取属性名为id的元素
*/
Elements id = document.getElementsByAttribute("id");
System.out.println(id);
System.out.println("====================");
/*
3.获取id属性值为1的元素对象
*/
Elements elementById = document.getElementsByAttributeValue("id", "1");
System.out.println(elementById);
System.out.println("====================");
/*
4.获取所有id为value的对象,类似第3种,但只返回一个element对象而非elements
*/
Element elementById1 = document.getElementById("1");
System.out.println(elementById1);
System.out.println("====================");
}
}
3.5 Elements 元素集合对象
元素Element对象的集合。可以当做 ArrayList来使用
基本方法同document
3.6 Element 元素对象
主要功能有:
1. 获取子元素对象:基本方法同document
2. 获取属性值
方法 | 用途 |
---|---|
String attr(String key) | 根据属性名称获取属性值 |
3. 获取文本内容
方法 | 用途 |
---|---|
String text() | 获取文本内容 |
String html() | 获取标签体的所有内容(包括字标签的字符串内容) |
代码示范
/**
* @author konley
* @date 2020-07-09 9:29
* Element对象的功能
*/
public class Demo05Element {
public static void main(String[] args) throws IOException {
/*
Element拥有Document的功能
*/
String path = Demo04Document.class.getClassLoader().getResource("XML/Demo01.xml").getPath();
File file = new File(path);
Document document = Jsoup.parse(file, "utf-8");
//获取所有user标签
Elements users = document.getElementsByTag("user");
//获取第一个name标签
Element user = users.get(0);
//获取第一个name标签
Element name = document.getElementsByTag("name").get(0);
//1. 获取user对象的id属性值
String id = user.attr("id");
System.out.println(id);
//2. 获取name标签的文本内容,text获取纯文本内容,html获取所有内容包括子标签
String text = name.text();
String html = name.html();
System.out.println(text);
System.out.println(html);
}
}
3.6 Node 节点对象
Node是Document和Element的父类
四、Selector选择器
提供快捷获取对象的语法,类似jQuery,不需要重新导包
方法
Elements select(String cssQuery)
语法:参考API文档
代码示范
/**
* @author konley
* @date 2020-07-09 9:40
* 快捷获取element对象
*/
public class Demo06Select {
public static void main(String[] args) throws IOException {
String path = Demo04Document.class.getClassLoader().getResource("XML/Demo01.xml").getPath();
File file = new File(path);
Document document = Jsoup.parse(file, "utf-8");
//查询name标签
Elements name = document.select("name");
//System.out.println(name);
//查询id值为1的元素
Elements select = document.select("#1");
//System.out.println(select);
//获取user标签并且id属性值为1的age标签的值
//方法一 链式编程
Elements select1 = document.select("user").select("[id=1]").select("age");
System.out.println(select1.text());
//方法二 直接获取
Elements select2 = document.select("user[id=1]>age");
System.out.println(select2.text());
}
}
五、XPath路径语言
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
注意事项:
- 使用Jsoup的Xpath需要额外导入jar包,
JsoupXpath-0.3.2.jar
- 可以查询w3cshool参考手册,使用xpath的语法完成查询
代码示范
/**
* @author konley
* @date 2020-07-09 9:50
* 使用XPath查询
*/
public class Demo07XPath {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
String path = Demo04Document.class.getClassLoader().getResource("XML/Demo01.xml").getPath();
File file = new File(path);
Document document = Jsoup.parse(file, "utf-8");
//根据document对象创建XPath
JXDocument jxDocument = new JXDocument(document);
//结合XPath语法查询
//1. 查询user标签
List<JXNode> jxNodes = jxDocument.selN("//user");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode.getElement());
}
System.out.println("==================");
//2. 查询user标签下的name标签
List<JXNode> jxNodes1 = jxDocument.selN("//user/name");
for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode.getElement());
}
System.out.println("==================");
//3. 查询带有id属性的user标签
List<JXNode> jxNodes2 = jxDocument.selN("//user[@id]");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode.getElement());
}
System.out.println("==================");
//4. user标签并且id属性值为1的age标签的值
List<JXNode> jxNodes3 = jxDocument.selN("//user[@id='1']/age");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode.getElement());
}
System.out.println("==================");
}
}