目录
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);
}
}
}
本文为博主原创文章,转载请注明出处!
若本文对您有些许帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!