基础知识
概念:
Extensible Markup Language,可扩展标记语言
说明:可扩展的意思是,标签都是自定义的
功能:存储数据(配置文件,在网络中传输)
xml与html的区别:
- html标签是预定义的,xml标签是自定义的
- html语法松散,xml语法严格
- html用于展示数据,xml用于存储数据
基本语法:
- 第一行必须定义文档声明
- 有且只有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- 标签名区分大小写
组成部分:
❶ 文档声明:格式:<?xml 属性列表 ?>
version(版本号。必须的属性)
encoding(编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1)
standalone(是否独立。yes表示不依赖其他文件,no表示依赖其他文件)
❷ 指令: <?xml-stylesheet type="text/css" href="loli.css" ?>
和html一样,用来引入外部样式表——但因为这不是xml的工作,因而基本废弃
❸ 标签:标签名称是自定义的
不要太离谱就行!数字开头、包含空格这种低级错误不要犯。
❹ 属性:就是键值对;注意id属性值唯一
❺ 文本:补充一个CDATA区——在该区域中的数据会被原样展示。语法: <![CDATA[萝莉赛高]]>
约束
约束:规定xml文档的书写规则。
作为框架的使用者:我们只需要做到:1.能够在xml中引入约束文档 2. 能够简单的读懂约束文档
两种约束技术:DTD(简单); Schema(复杂)
------------------------------------------------ DTD ----------------------------------------------------
引入dtd文档到xml文档中:
▶ 内部dtd:将约束规则定义在xml文档中 <!DOCTYPE 根标签名 [约束文档]> (极少使用)
▶ 外部dtd:将约束的规则定义在外部的dtd文件中
本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名" "dtd文件的位置URL">
Demo:
约束文档(student.dtd)
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
XML文件(student.xml)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="s001">
<name>Alice</name>
<age>10</age>
<sex>女</sex>
</student>
<student number="s002">
<name>Cocoa</name>
<age>12</age>
<sex>女</sex>
</student>
</students>
------------------------------------------------ Schema ----------------------------------------------------
首先:
DTD在引入多个约束文档时,会出现约束冲突的问题————<name>标签上,用的是哪一个约束文档的约束?
因此Schema引入了"xml命名空间",即xmlNamespace,即xmlns————
每一个约束文档都对应一个命名空间,在使用标签时,需要给标签写上命名空间前缀;命名空间通常很长,因此需要取个别名
引入:
1.写xml文档的根元素
2.引入xsi前缀(固定)
3.引入xsd文件命名空间
4.给每一个命名空间取个别名
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -- 固定格式
xmlns="http://www.springframework.org/schema/beans" -- 默认命名空间(没有别名)
xmlns:context="http://www.springframework.org/schema/context" -- 给命名空间取别名
xmlns:mvc="http://www.springframework.org/schema/mvc" -- 给命名空间取别名
xsi:schemaLocation=" -- 引入多个约束文档(3个)
http://www.springframework.org/schema/beans -- 命名空间
http://www.springframework.org/schema/beans/spring-beans.xsd -- Schema文档实际位置
http://www.springframework.org/schema/context --...
http://www.springframework.org/schema/context/spring-context.xsd --...
http://www.springframework.org/schema/mvc --...
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> --...(两两对应)
<abc></abc> -- 通过别名,对应到ns(默认),再对应到文档
<context:abc></context:abc> -- 通过别名,对应到ns,再对应到文档
<mvc:abc></mvc:abc> -- 通过别名,对应到ns,再对应到文档
</beans>
解析
解析即读取,将文档中的数据读取到内存中。
解析xml的方式(思想):
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
操作方便,可以对文档进行CRUD的所有操作;但占内存 - SAX:逐行读取,基于事件驱动(基于队列的)
不占内存;但只能读取,不能增删改
xml常见的解析器:JAXP、DOM4J、 Jsoup、PULL
------------------------------------------------ Jsoup ----------------------------------------------------
1. 导入jar包
2. 获取Document对象
3. 获取对应的标签Element对象
4. 获取数据
String path = Demo1.class.getClassLoader().getResource("student.xml").getPath(); // 获取xml资源路径
Document document = Jsoup.parse(new File(path), "utf-8"); // 获取Document对象
Elements elements = document.getElementsByTag("name"); // 获取Element(s)对象
System.out.println(elements.get(0).text()); // 获取内容(数据)
------------------------------------------------- 对象 ----------------------------------------------------
1. Jsoup 工具类。可以解析html或xml文档,返回Document
parse(File in, String charsetName) 解析xml或html文件的。
parse(String html) 解析xml或html字符串
parse(URL url, int timeoutMillis) 通过网络路径获取指定的html或xml的文档对象
2. Document 文档对象。即整个DOM树。
3. Elements 元素Element对象的集合。可以看做 ArrayList<Element> 来使用
4. Element 元素对象
▶ 获取子元素对象
getElementById(String id)
getElementsByTag(String tagName)
getElementsByAttribute(String key)
getElementsByAttributeValue(String key, String value)
▶ 获取属性值
attr(String key)
▶ 获取文本内容
text():获取文本内容(不包括标签)
html():获取所有内容(包括标签)
5. Node:节点对象。是Document和Element的父类
快捷查询
-------------------------------------------- Selector选择器 ---------------------------------------------------
document.select("student") // 查询所有的student标签
document.select("student name") // 查询student下的name标签
document.select("student[number]") // 查询带有number属性的student标签
document.select("student[number='s001']") // 查询带有number属性且number属性值为"s001"的student标签
注: .calss, #id 选择器也有,但不常用
-------------------------------------------- XPath ----------------------------------------------------------
XPath为XML路径语言,需要导入jar包
Document document = Jsoup.parse(new File(path), "utf-8");
JXDocument jxDocument = new JXDocument(document);
List<JXNode> jxNodes = jxDocument.selN("//student") // 查询所有的student标签
List<JXNode> jxNodes = jxDocument.selN("//student/name") // 查询student下的name标签
List<JXNode> jxNodes = jxDocument.selN("//student[@number]") // 查询带有number属性的student标签
List<JXNode> jxNodes = jxDocument.selN("//student[@number='s001']") // 查询带有number属性且number属性值为"s001"的student标签
可使用getElement()方法,将JXNode节点对象转化为我们熟悉的元素对象
End ♬
by a Lolicon