XML
1. XML简介
概念:可扩展标记语言
- 可扩展:标签都是程序员自定义
功能:存储数据,作为配置文件,在网络中传输数据
注意:
properties
文件只能存储小配置文件
xml与html区别
- xml标签都是自定义,html标签都是预定义
- xml的语法严格,html语法松散
- xml是用来存储数据,html是用来展示数据
基本语法
- xml文档的后缀名
.xml
- xml第一行必须定义为文档声明
- xml文档中必须有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- xml标签名称区分大小写
2. XML组成部分
-
文档声明
- 格式:
<?xml 属性列表?>
- 属性列表:
version
:版本号(必须),一般1.0encoding
:编码方式。告知解析引擎当前文档使用的字符集,默认值ISO-8859-1
standalone
:是否依赖其他文件 yes或no
- 格式:
-
标签:名称自定义
- 规则:
- 名称可以包含字母、数字、其他字符
- 名称不能以数字或者标点符号开始
- 名称不能以xml开头
- 名称不能包含空格
- 规则:
-
属性:id属性唯一
-
文本:
- CDATA区:原样展示数据或代码
- 格式:
<![CDATA[数据]]>
3.XML约束
约束:规定xml文档的书写规则
约束技术分类:
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术,比DTD严格得多
DTD
后缀名:.dtd
使用步骤:
- 引入dtd文档到xml文档中
- 内部dtd:将约束规则定义在xml文档中
- 外部dtd:将约束规则定义在外部的dtd文件中
- 本地引入:
<!DOCTYPE xml根标签名称 SYSTEM "dtd文件路径">
- 网络引入:
<!DOCTYPE xml根标签名称 PUBLIC "dtd文件名" "dtd文件网络路径URL">
- 本地引入:
Schema
后缀名:.xsd
使用步骤:
- 引入xsd文档
- 填写xml文档的根标签
- 引入xsi前缀。(固定格式)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 引入xsd文件命名空间。
xsi:SchemaLocation="文件路径 xsd文件名"
- 为每一个xsd文档声明前缀。
xmlns:起名="文件路径
"
4. 解析XML文档
解析:操作xml文档,将文档中的数据读取到内存中
-
操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档。持久化存储
-
解析xml文档的方式
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树(一般用于服务端)
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- SAX:逐行读取,读取一行释放一行(一般用于移动端)
- 优点:不占内存
- 缺点:只能读取,不能CRUD
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树(一般用于服务端)
-
xml的解析器:
-
jsoup(DOM思想):
-
使用步骤:
-
导入jar包
jsoup-1.11.2.jar
注意:文件路径不能带空格
-
获取Document对象
-
获取对应的标签Element对象
-
获取数据
-
-
-
xml实例代码
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student number="AFan_0001">
<name id="tom">tom</name>
<age>32</age>
<sex>male</sex>
</student>
<student number="AFan_0002">
<name id="jack">jack</name>
<age>12</age>
<sex>female</sex>
</student>
<student number="AFan_0003">
<name id="afan">afan</name>
<age>20</age>
<sex>male</sex>
</student>
</students>
jsoup实例代码
package Afan;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
//Jsoup解析XML文档
public class JsoupDemo01 {
public static void main(String[] args) throws IOException {
//1. 获取xml文档的路径
String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
//2. 解析xml文档,加载文档进内存,获取dom树
Document document = Jsoup.parse(new File(path), "UTF-8");
//3. 获取元素对象 Element
Elements name = document.getElementsByTag("name");
System.out.println("标签个数:"+name.size());
System.out.println("标签元素:"+name.text());
}
}
对象的使用
-
Jsoup
:工具类,可以解析或xml文档,返回Document
对象parse
方法:解析html或xml文档,返回Documentparse(File in,String charsetName)
:根据字符集解析xml或html文档parse(String html)
:解析xml或html文档字符串parse(URL url,int timeoutMillis)
:通过网络路径获取指定的html或xml文档对象
-
Document
:文档对象。代表内存中的dom树-
获取
Element
对象-
getElementById(String id)
:根据id属性值获取唯一的Element对象 -
getElementsByTag(String tagName)
:根据标签名称获取元素对象集合 -
getElementsByAttribute(String key)
:根据属性名称获取元素对象集合 -
getElementsByAttributeValue(String key,String value)
:根据对应的属性名和属性值获取元素对象集合
-
-
-
Elements
:元素Element对象的集合。相当于ArrayList<Element>
-
Element
:元素对象-
获取子元素对象
-
getElementById(String id)
:根据id属性值获取唯一的Element对象 -
getElementsByTag(String tagName)
:根据标签名称获取元素对象集合 -
getElementsByAttribute(String key)
:根据属性名称获取元素对象集合 -
getElementsByAttributeValue(String key,String value)
:根据对应的属性名和属性值获取元素对象集合
-
-
获取属性值
String arrr(String key)
:根据属性名称获取属性值
-
获取文本内容
String text()
:获取文本内容String html()
:获取标签体的所有内容(包括子标签的字符串内容)
-
-
Node
:节点对象(了解)- 是
Document
和Element
- 是
实例代码
package Afan;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
//Jsoup解析XML文档
public class JsoupDemo01 {
public static void main(String[] args) throws IOException {
//1. 获取xml文档的路径
String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
//2. 解析xml文档,加载文档进内存,获取dom树
Document document = Jsoup.parse(new File(path), "UTF-8");
//根据标签名称name获取元素对象
Elements name = document.getElementsByTag("name");
System.out.println(name);
System.out.println("--------------------------");
//获取number属性的元素对象
Elements number = document.getElementsByAttribute("number");
System.out.println(number);
System.out.println("--------------------------");
//获取number=AFan_0002的元素对象
Elements person = document.getElementsByAttributeValue("number", "AFan_0002");
System.out.println(person);
}
}
快捷查询方式
-
selector
:选择器- 使用方法:
Elements select(String cssQuery)
- 语法:cssQuery语法与CSS选择器语法类似
- 使用方法:
-
XPath
:XPath即为XML路径语言,用于确定XML文档的某一部分- 使用Jsoup的XPath需要导入jar包
JsoupXpath-0.3.2.jar
- 查询w3school参考手册,使用XPath的语法完成查询
- 使用Jsoup的XPath需要导入jar包
XPath的常用表达式
表达式 | 描述 |
---|---|
nodename | 选取nodename元素的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
… | 选取当前节点的父节点。 |
@ | 选取属性。 |
XPath实例代码
package Afan;
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.util.List;
//Jsoup解析XML文档
public class JsoupDemo01 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//1. 获取xml文档的路径
String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
//2. 解析xml文档,加载文档进内存,获取dom树
Document document = Jsoup.parse(new File(path), "UTF-8");
JXDocument jxDocument = new JXDocument(document);
//查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("-----------------");
//查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("-----------------");
//查询student标签下的id属性为jack的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='jack']");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
}
}