JavaWeb——XML入门详解(概述、语法、约束、Jsoup解析、Xpath解析)
1、XML概述
XML,Extensible Markup Language可扩展标记语言(也是由w3c(万维网联盟)推出的)。可扩展,标签都是自定义的,如<uesr>、<student>。其主要功能就是存储数据,用于配置文件使用,另外存储的数据可以在网络中传输。
1)xml宇html的区别?
- xml标签都是自定义的,html标签是预定义的;
- xml语法严格,html语法松散;
- xml是存储数据的,html是展示数据;
2)xml的语法
- xml的后缀名为 .xml
- xml的第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须用引号(单双均可)引起来
- 标签必须正确关闭(自闭和或围堵标签)
- xml标签名称区分大小写
【举例】:xml语法
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>10</age>
<gender>male</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>11</age>
<gender>female</gender>
</user>
</users>
3)xml的组成部分
1、文档声明 格式:<?xml 属性列表 ?> 属性列表:version,版本号,必须 属性,当前为1.0 encoding,编码方式,告知解析引擎当前文档使用的字符集,默认为ISO-8859-1 standalone,是否独立,值为yes表示不依赖其他文件,值为no表示依赖其他文件。
2、指令(了解):结合CSS的
3、标签:名称自定义的, 规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
4、属性:id属性值唯一
5、文本:CDATA区:在该区域中 数据会被原样展示<![CDATA[ 数据 ]]>
2、XML约束
约束是规定xml文档的书写规则,作为框架的使用者(程序员),需要能够在xml中引入约束文档,且能够简单的读懂约束文档。约束技术的分类:
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
1)DTD,引入dtd文档到到xml文档中: 内部dtd:将约束规则定义在xml文档中(了解,不常用) 外部dtd:将约束规则定义在外部的dtd文件中 本地:<!DOCTYPE 跟标签名 SYSTEM "dtd文件的位置"> 网络:<!DOCTYPE 跟标签名 PUBLIC "dtd文件名字" "dtd文件位置URL">
2)Schema,引入schema文档到xml: 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">
3、XML解析
解析,指的是操作xml文档,将文档中的数据读取到内存中,操作xml文档操作方式有两种:
- 解析(读取):将文档中的数据读取到内存中;
- 写入:将内存中的数据保存到xml文档中,持久化的存储。
1)解析xml的方式
1、DOM:将标记语言文档一次性加载至内存,在内存中形成一颗dom树 优点:操作方便,可以对文档进行CRUD的所有操作,一般用于服务器 缺点:占内存
2、SAX:逐行读取,基于事件驱动 优点:不占内存,适用于内存较小的设备,如手机 缺点:只能读取,不能增删改。
2)常见的解析器
- JAXP:DOM方式解析,SUN公司提供,支持dom和sax两种思想,性能不佳,基本不用;
- DOM4J:DOM方式解析,一款优秀的解析器
- Jsoup:DOM方式解析,jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:SAX方式解析,Android内置的解析器。
3)Jsoup解析器
1、Jsoup是免费的第三方开源解析器,快速入门步骤:
- 导入jar包;
- 获取Document对象:
- 获取对应的标签,Element对象;
- 获取数据。
【举例】:Jsoup解析器读取sudent.xml文档内容
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//获取document对象,根据xml文档
//获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//解析xml文档,加载文档进内存,获取dom树;
Document document = Jsoup.parse(new File(path), "utf-8");
//获取元素对象Element
Elements elements = document.getElementsByTag("name");
System.out.println("个数:"+elements.size());
Element element = elements.get(0);
String name = element.text();
System.out.println("name:"+name);
}
}
2、对象的使用
- Jsoup:是一个工具类,可以解析html或xml文档,返回Docment对象; *parse:解析html或xml文档,返回Document; parse(File in, String charsetName),解析html或xml文件的 parse(String html),解析html或xml字符串的,参数html实际就是文档的内容; parse(URL url, int timeoutMillis),通过网络路径获取指定的html或xml的文档对象;
URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");
Document document = Jsoup.parse(url, 20000);
System.out.println(document);
- Document:文档对象,代表内存中的dom树; *获取Element对象 getElementByITag(String tagName),根据标签名获取元素对象集合 getElementByAttribute(String key),根据属性名称获取元素对象集合 getElementsByAttributeValue(String key,String value),根据对应的属性名和属性值获取元素对象集合 getElementById(String id),根据id属性值获取唯一的Element对象
- Elements:元素Element对象的集合,可以当作ArrayList<Element>使用;
- Element:元素对象 *获取子元素对象 getElementByITag(String tagName),根据标签名获取元素对象集合 getElementByAttribute(String key),根据属性名称获取元素对象集合 getElementsByAttributeValue(String key,String value),根据对应的属性名和属性值获取元素对象集合 getElementById(String id),根据id属性值获取唯一的Element对象 *获取属性值 attr(String key),根据属性名称获取属性值 *获取文本内容 text(),获取所有子标签的纯文本内容 html(),获取便签体的所有内容(包括子标签的标签和文本内容)
- Node:节点对象,是Document和Element的父类
3、Jsoup快捷查询方式
- selector选择器 使用方法:Elements select(String query),语法参考Selector类中定义的语法
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//获取document对象,根据xml文档
//获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//查询name标签
Elements elements = document.select("name");
System.out.println(elements);
//查询id值为001
Elements element = document.select("001");
System.out.println(element);
//获取student标签,且number属性值为s001的age子标签
Elements elements1 = document.select("student[number='s001'] > age");
System.out.println(elements1);
}
}
- Xpath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 注意:使用Jsoup的Xpath需要额外导入jar包,查询w3cschool参考手册,使用Xpath语法完成查询。
public class JsoupDemo1 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//获取document对象,根据xml文档
//获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//结合Xpath语法查询
//查询所有student便签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
//查询所有student便签下name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
//查询student标签下带id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
//查询student标签下带id属性的name标签,且id属性值为001
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='001']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kubernetes(四)之Docker存储卷
- 使用卷积神经网络构建图像分类模型检测肺炎
- 如何提升docker容器安全性
- CICD(三)Ansible常用模块以及案例
- 深入SVM:支持向量机核的作用是什么
- kubernetes(三)之Docker网络详解
- kubernetes(二)之Docker容器及镜像
- 反向传播算法:定义,概念,可视化
- Go语言(二十一) 常见的模块使用
- kubernetes(一)之Docker基础入门
- Go语言(二十)日志采集项目(二)Etcd的使用
- prometheus入门(一)
- Go语言(十九)日志采集项目之logagent开发(一)
- Go语言(十 八)context&日志项目
- 使用梯度上升欺骗神经网络,让网络进行错误的分类