day11 --> (XML)
1.XML:
1.概念:
Extensible Markup Language :可扩展标记语言
可扩展:标签都是自定义的。<user>、<student>
2.功能:
存储数据:
1、配置文件
2、在网络中传输
3.xml和HTML的区别:
- xml标签都是自定义的,html标签都是预定义的
- xml的语法严谨,html语法松散
- xml是存储数据的,html是展示数据的
properties :
name=zhangsan
age=23
gender=nan
name=lisi
age=24
gender=nv
<user id='1'>
<name>zhangsan</name>
<age>23</age>
</user>
<user id='2'>
<name>zhangsan</name>
<age>23</age>
</user>
w3c : 万维网联盟
4.语法:
基本语法:
- xml文档的后缀名:.xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须私用引号引起来(单双都可)
- 标签必须正确关闭
- xml标签名称区分大小写
快速入门:
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
组成部分:
1.文档声明
1.格式:<?xml 属性列表 ?>
2.属性列表:
1.version : 版本号,【必须的属性,目前1.0】
2. encoding :编码方式,告知解析引擎当前文档使用的字符集,
3.standalone : 是否独立
取值:
yes : 不依赖其他文件,独立的
no : 依赖其他文件
2.指令(了解):结合CSS
3.标签:标签名称自定义的
规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 xml(或者XML、Xml 等等)开始
- 名称不能包含空格
4.属性:
id属性值唯一
5.文本:
CDATE区:在该区域中的数据会被原样展示【大于号、小于号等一些字符】
格式:<![CDATA[ 数据 ]]>
约束:
规定xml文档的书写规则
作为使用者(程序员):
1、能够在xml中引入约束文档
2、能够简单地读懂约束文档

约束地分类:
1.DTD:一种简单地约束技术
2.Schema:一种复杂地约束技术
约束方式一:DTD
引入dtd文档到xml文档中(不同的格式引入的方式不同):
内部dtd : 将约束规则定义在xml文档中
外部dtd: 将约束规则定义在外部的dtd文档中
本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">,SYSTEM表示本地
网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件的名字" "dtd文件的位置URL">
<!ELEMENT students (student*) > <!--根标签为students,里边可以student子标签,*表示可以放无限个-->
<!ELEMENT student (name,age,sex)> <!--student标签中可以出现name,age,sex三个标签,并且按照顺序出现-->
<!ELEMENT name (#PCDATA)> <!--(#PCDATA)表示name、age、sex标签中放地是字符串-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
<!--表示student标签可以有属性,属性名为number,属性的类型为ID,表示id值唯一, #REQUIRED:表示number属性必须出现-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="s001">
<name>zhangsan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>24</age>
<sex>female</sex>
</student>
</students>
不过dtd文档约束还是有一定的缺陷的,它不能限定标签内的数据类型,比如<age>-15</age>
约束方式二:Schema:
引入Schema约束文档的步骤:
1、填写xml文档的根元素
2、引入xsi前缀(前缀不唯一)
3、引入xsd文件命名空间
4、为每一个xsd约束声明一个前缀,作为表示具体使用的是哪个约束

3.解析:操作xml文档,将文档中的数据读取到内存中
操作xml文档
1、解析(读取):将文档中的数据读取到内存中
2、写入:将内存中的数据保存到xml文档中,持久化地存储(不讲解)
解析xml方式:
1.DOM : 将标记语言文档一次性加载进内存,在内存中形成一颗dom树
优点:操作比较方便,可以对文档进行CRUD地所有操作
缺点:消耗内存,不适用于内存较小地设备(手机、冰箱...)
2.SAX : 逐行读取【读完一行就释放】,基于事件驱动的
优点:不占内存
缺点:只能读取,不能增删改
xml常见解析器:
1.JAXP :sun公司提供的解析器,支持dom和sax两种思想
2.DOM4J :一款非常优秀的解析器 【常用】
3.Jsoup :jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4.PULL : Android操作系统内置的解析器,sax方式
Jsoup的使用:
快速入门,步骤:
1、导入jar包
2、获取Document对象
3、获取对应的标签
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//1、导入jar包
//2、根据xml文档获取Document对象
//2.1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文档 :加载文档进内存,获取dom树 ---> Document
Document document = Jsoup.parse(new File(path),"utf-8");
//3.获取元素对象 Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1获取第一个name的Element对象
Element element = elements.get(0);
System.out.println(element.text());
}
}
对象的使用:
1.Jsoup : 工具类,可以解析html或xml文档,返回Document
parse :解析html或xml文档,返回Document
parse(File in, String charsetName) : 解析xml或html文件
parse(String html) : 解析html或者字符串
parse(URL url, int timeoutMills) : 通过网络路径获取指定的 html 或 xml ,【参数一:文档路径,参数二:超时时间】
2.Document : 文档对象。代表内存中dom树
主要用来获取Element对象:
getElementById(String id) : 根据id值获取唯一的element对象【属性必须为id才可以获取】
getElementsByTag(String tagName) : 根据标签名称获取元素对象集合
getElementsByAttribute(String key) : 根据属性名称获取元素对象集合
getElementsByAttributeValue(String key,String value) : 根据对应的属性名和属性值获取元素对象集合
3.Elements:元素Element对象的集合,继承自ArrayList类,可以当作ArrayList<Element>来使用
4.Element:元素对象
1.获取Element子元素对象:
getElementById(String id) : 根据id值获取唯一的element对象【属性必须为id才可以获取】
getElementsByTag(String tagName) : 根据标签名称获取元素对象集合
getElementsByAttribute(String key) : 根据属性名称获取元素对象集合
getElementsByAttributeValue(String key,String value) : 根据对应的属性名和属性值获取元素对象集合
2.获取属性值:
String attr(String key) : 根据属性名称获取属性值
3.获取文本内容:
String text() : 获取文本内容【所有子标签的纯文本内容】
String html() : 获取标签体的所有内容【包含标签 + 文本】
5.Node : 节点对象,是所有对象的”爹“
是Document和Element的父类 :
快捷查询方式:
1.selector :选择器
使用的方法:Elements select(String cssQuery)
语法:参考Selector类定义的语法:
2.XPath :
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
注意事项:
1.使用Jsoup的Xpath需要导入额外的jar包
2.查询w3cschool参考手册,使用Xpath的语法完成查询
//Xpath查询
//导入Xpath的jar包
public class JsoupDemo6 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//由于获取到的document对象属于Jsoup,而Jsoup不支持Xpath语法,因此需要创建Xpath jar包下的JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//接下来就可以结合Xpath的语法进行查询了
List<JXNode> jxNodes = jxDocument.selN("//student");
/* for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}*/
//查询所有studnet标签下的name标签
List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
/* for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode);
}*/
//查询student标签下带有id属性的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
/* for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}*/
//查询student标签下带有id属性的name标签,并且id属性值为itcast
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
}
}
浙公网安备 33010602011771号