XML概述
XML是什么语言?有什么特点?
- Entensible Markup Language 可拓展标记语言
- XML也是由标签构成的,标签的内容都是自定义的.
XML的主要作用是什么? - 作为配置文件(Spring/SpringMvc/MyBatis/Hibernate)
- 在网络中进行数据的传输与交互(基本没什么人用了 -> json) 一些老的项目,WebService还是使用XML进行交互.
XML与HTML的区别是什么? - XML的标签都是自定义的,HTML标签都是预定义的.
- XML的语法非常的严格,必须按照XML的要求进行书写,HTML的语法相对于XML来说比较松散.
- XML的主要作用就是作为配置文件/进行数据交互使用的,HTML的主要是展示数据用的.
XML入门
XML的基本语法是什么? - XML文件必须是.xml.XML文件中的第一行必须为文档声明,不是说文档声明必须在第一行,而是第一行必须是文档声明[必须行号为1的那一行书写文档声明])
- XML中必须有且仅有一个根标签.
- XML中的标签可以有属性值 -> 属性名=属性值 属性值必须用单引号/双引号进行包裹.
- XML中标签也有围堵标签/自闭和标签,但是如果使用围堵标签,围堵标签必须正确关闭.
- XML标签的名称区分大小写(HTML中不区分大小写的,但是推荐小写).
XML组成部分 - 文档声明
- 指令声明
- 标签声明
- 属性声明
- 文本声明
XML中的文档声明部分格式是什么?属性列表是什么?
<?xml 属性列表 ?>
version:版本号 -> 1.0(有1.1版本但是不向下兼容,所以1.0仍是主流)
encoding:编码方式 -> UTF-8
standalone:是否独立 (是否依赖其他的文件) [可写可不写]
<?xml version='1.0' encoding='UTF-8' ?>
XML中的标签部分的使用规则是什么?
- 标签名称可以包含字母/数字/其他的字符(一般来说字母就足够了)
- 标签名称不可以由数字/标点符号开始.
- 标签名称不可以由XML三个字母的任何形式开始. xml XML Xml.
- 名称不可以包含空格
- 见名知意
XML中属性部分由什么构成?规则是什么? - 键值对 属性名=属性值
- 属性值要用单引号/双引号进行包裹.
- 全局唯一.
XML中的文本部分如果中间包含实体字符(转义字符)应该如何处理?格式是什么? - 可以将空格转换为
- 2.使用CDATA区 -> CDATA中的数据会原样进行展示.
XML约束概述
什么是XML约束?
规定XML的书写规定的。 - 规定 -> 是由框架提供规定,我们通过规定写出配置文件,框架读取配置文件,完成配置.
- 1.简单读懂即可. 2.可以将约束导入到XML中即可(脚手架文件)
XML约束文档分为哪几类? - DTD约束
- Schema约束
XML约束DTD - DTD约束中的各个组成部分是什么意思?
<!-- 定义了一个students标签,这个标签中只可以有student标签,student标签出现的次数为0-n次(可以不出现) 如果说想要student标签出现最少1次,*要改成+ -->
<!ELEMENT students (student*)>
<!-- 定义一个student标签,这个标签只可以有name,age,gender标签并且这三个要按照顺序出现 -->
<!ELEMENT student (name,age,gender)>
<!-- 定义了一个name标签,name标签中可以放什么数据? #PCDATA表示字符串 -->
<!ELEMENT name (#PCDATA)>
<!-- 定义了一个age标签,age标签中可以放什么数据? #PCDATA表示字符串 -->
<!ELEMENT age (#PCDATA)>
<!-- 定义了一个gender标签,gender标签中可以放什么数据? #PCDATA表示字符串 -->
<!ELEMENT gender (#PCDATA)>
<!-- 定义元素中的属性,给student元素定义了属性,key=value,key叫做number,key是ID类型(全局唯一) #REQUIRED必须有. -->
<!ATTLIST student number ID #REQUIRED>
如何引入DTD文档?
内部引用
格式:
<!DOCTYPE 根标签名称[
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,gender)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
]>
外部引入
本地外部引入(推荐DTD约束和XML文件在一起)
<!DOCTYPE 根标签名称 SYSTEM "引入的DTD文件名称">
网络外部引入
<!DOCTYPE 根标签名称 PULBIC "引入的DTD文件名称(随便写)" "DTD的网络URL地址">
XML约束Schema
Schema约束本身就是XML文件
Schema的组成部分
<!-- 定义标签 -->
<xsd:element name="students" type="studentsType"/>
<!-- 定义复杂类型(复合类型) -->
<xsd:complexType name="studentsType">
<!-- 定义元素组成,要求组中的元素以指定的顺序出现在包含元素中。每个子元素可出现0次到任意次数。-->
<xsd:sequence>
<!-- 定义简单类型 -->
<xsd:simpleType name="sexType">
<!-- 定义XML元素的使用限制 -->
<xsd:pattern value="heihei_\d{4}"/>
引入方式
填写xml文档的根元素
引入xsi前缀
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
引入xsd文件命名空间
xsi:schemaLocation="命名空间名称 引入的约束文件名称(可以是本地也可以是网络的)"
为每一个xsd约束声明一个前缀,作为标识.
xmlns="http://www.baidu.com/xml"
当引入多个约束文件的时候,要给约束文件起名 -> 方便使用约束.
默认不写(在只引入一个约束文件前提下,可以不写)
xmlns:前缀名称="命名空间名称"
XML解析方式
XML文档的操作方式都有那几种?
- 读取(文档中的元素的值)
- 写入(使用的比较少)
XML文档解析的方式有哪几种?有什么优缺点?
DOM解析思想 - 将XML文档一次性加载到内存中,形成一颗COM树
- 好处:使用DOM思想来操作XML可以进行CRUD的操作.
- 坏处:坏处:占用内存(服务器内存都比较大) 后端:都是使用DOM解析思想.
SAX解析思想 - 逐行读取,基于事件的区别(有一个XML文档,我想读取title标题,从第一行开始读取,当读取到title的开始标签的时候,触发事件,读取到title的下一行作为数据返回.)
- 好处:不占用内存
- 坏处:只能读取,不能够写入/更新/删除. 手机/内存较小的设备.
XML解析常见的解析器
常用的XML解析器有哪几种?分别有什么好处? - JAXP:SUN公司提供的标记语言解析器 -> 同时支持DOM和SAX但是性能一般.
- DOM4J:DOM解析思想的解析器.
- Jsoup:本身是一个HTML的解析器 -> HTML和XML都是标记语言,使用比较方便. (用于爬虫)
- PULL:Andriod内置的解析器 -> 采用SAX解析思想去进行解析.
XML解析Jsoup快速入门
Jsoup解析XML的步骤是什么?
package com.itheima.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class QuickJsoup {
public static void main(String[] args) throws IOException {
/*
1.将XML加载到内存中 -> Jsoup.parse()方法可以将XML文档加载到内存中并且返回一个Document对象(Dom树)
parse方法需要一个File参数 -> File封装的就是XML文档.
*/
String xmlPath = QuickJsoup.class.getClassLoader().getResource("Test.xml").getPath();
File xmlFile = new File("Aa_XML\\Test.xml");
/*File xmlFile = new File(xmlPath.trim());*/
Document document = Jsoup.parse(xmlFile, "UTF-8");
/*2.通过Dom树查找对应的元素(Element)
Element = <name>张三</name> Element = <name>Sloog</name> Element + Element = Elements(继承自ArrayList<Element>的一个集合)
*/
final Elements elements = document.getElementsByTag("name");
//3.遍历集合 -> 获取每一个组成元素 Element
for (Element element : elements) {
/*
element中封装的是:
<name>
张三
</name>
*/
System.out.println(element.text());
}
}
}
XML解析Jsoup-Jsoup对象
Jsoup对象是什么?
- org.jsoup包中的工具类 -> 作用:将XML/HTML文档加载到内存中形成Dom树(返回一个Document对象.)
Jsoup对象常用加载的方式(重载形式)有哪几种? - parse(File file,String characterName) -> 通过File对象将File对象所表示的XML文档加载到内存中通过characterName方式进行解码.
- parse(String html) -> 通过String字符串形式加载XML文档/HTML文件进入到内存.
- arse(URL u,int timeoutmillis) -> URL统一资源定位符,表示互联中的一个资源 实际上就是一个网址
XML解析Jsoup-Document对象
Document对象是什么? - 文档对象,代表内存中的DOM树.
Document对象根据标签名称获取集合的方式是什么? - document.getElementsByTag(“标签名称”);
Document对象根据属性名称获取集合的方式什么? - document.getElementsByAttribute(“属性名称”);
Document对象根据属性名称和对应的属性值获取集合的方式什么? - document.getElementsByAttributeValue(“属性名”,“属性值”);
如何通过根据ID值获取唯一的Element对象? - document.getElementById(“ID值”); //ID全局唯一
XML解析Jsoup-Element对象
Element对象是什么? - 元素对象
如何根据属性名获取属性值? - 可以通过attr(“属性名”)返回对应的属性值.
如何获取文本内容? - text();
html()方法和text()方法有什么区别? - test()方法只会获取子标签中的纯文本内容,html()方法将会获得标签体中的所有内容.
XML解析Jsoup-Selector选择器查询
Selector选择器使用的方法是哪个? - select(String cssQuery)
select方法的参数 - CSSQuery就是Css中的选择器相关的语法.
XML解析Jsoup-Xpath(wanghaomiao)查询
要用Xpath进行查询,需要先做什么事情? - 导入jar包
- 之前是通过document对象进行查询的 -> 如果想要使用XML路经查询语言(xPath)进行查询的话. 需要将document转换为xPath支持的对象.
- JXDocument jxDocument = new JXDocument(document);
使用Xpath进行查询,需要使用哪个方法? - selN(String xPath)