XML:
1、概念
- Extensible Markup Language 可扩展标记语言。
- 可扩展:标签都是自定义的。例如:
<user> <student>
- 功能:存储数据、充当配置文件、网络中数据传输
- XML与HTML的区别
1、xml标签都是自定义的,html标签是预定义。
2、xml的语法严格,html语法松散
3、xml是存储数据的,html是展示数据
- 可扩展:标签都是自定义的。例如:
2、语法:
-
XML文档声明
<?xml version="1.0" encoding="UTF-8"?>
1、文档声明必须为<?xml开头,以?>结束;
2、文档声明必须从文档的0行0列位置开始;
3、文档声明只有三个属性:
(1)versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
(2)encoding:指定当前文档的编码。可选属性,默认值是utf-8;
(3)standalone:指定文档独立性。可选属性,默认值为yes,表示当前文档是独立文档。如果为no表示当前文档不是独立的文档,会依赖外部文件。 -
元素
<servlet>
1、元素是XML文档中最重要的组成部分,
2、普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>
3、元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
4、空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<c/>
5、元素命名:
(1) 区分大小写
(2) 不能使用空格,不能使用冒号:
(3) 不建议以XML、xml、Xml开头
6、良好的XML文档,必须有一个根元素。 -
属性
<web-app version="2.5">
1、属性是元素的一部分,它必须出现在元素的开始标签中
2、属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
3、一个元素可以有0~N个属性,但一个元素中不能出现同名属性
4、属性名不能使用空格、冒号等特殊字符,且必须以字母开头 -
注释
XML的注释与HTML相同,即以“<!--”
开始,以“-->”
结束。注释内容会被XML解析器忽略!
3、快速入门
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
4、约束
-
约束:规定xml文档的书写规则
-
分类:
1、DTD:一种简单的约束技术
2、Schema:一种复杂的约束技术 -
DTD:
1、 引入dtd文档到xml文档中
2、内部dtd:将约束规则定义在xml文档中
3、外部dtd:将约束的规则定义在外部的dtd文件中
4、本地:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
5、网络:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
-
Schema:
1、引入Schema约束
2、填写xml文档的根元素
3、引入xsi前缀.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4、引入xsd文件命名空间.xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
5、为每一个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">
解析XML
1、解析
解析(读取):将文档中的数据读取到内存中
回写(写入):将内存中的数据保存到xml文档中。持久化的存储
2、解析方法
1、 DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
优点:操作方便,可以对文档进行CRUD的所有操作
缺点:占内存
2、SAX:逐行读取,基于事件驱动的。
优点:不占内存。
缺点:只能读取,不能增删改
3、解析器
1、JAXP:sun公司提供的解析器,支持dom和sax两种思想
2、DOM4J:一款非常优秀的解析器
3、Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4、 PULL:Android操作系统内置的解析器,sax方式的。
4、解析开发包
1、JAXP:sun公司提供支持DOM和SAX开发包
2、JDom:dom4j兄弟
3、jsoup:一种处理HTML特定解析开发包
4、dom4j:比较常用的解析开发包,hibernate底层采用。
Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
1、 导入jar包
2、 获取Document对象
3、 获取对应的标签Element对象
4、 获取数据
//1获取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//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);
//3.2获取数据
String name = element.text();
System.out.println(name);
Dom4j
//#1 获得document
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/cn/itcast/a_xml/web.xml"));
//#2 获得根元素
Element rootElement = document.getRootElement();
//打印version属性值
String version = rootElement.attributeValue("version");
System.out.println(version);
//#3 获得所有子元素。例如:<servlet>/<servlet-mapping>
List<Element> allChildElement = rootElement.elements();
//#4 遍历所有
for (Element childElement : allChildElement) {
// #5.1 打印元素名
String childEleName = childElement.getName();
System.out.println(childEleName);
// #5.2 处理<servlet> ,并获得子标签的内容。例如:<servlet-name> 等
if("servlet".equals(childEleName)){
// 方式1:获得元素对象,然后获得文本
Element servletNameElement = childElement.element("servlet-name");
String servletName = servletNameElement.getText();
System.out.println("\t" + servletName);
// 方式2:获得元素文本值
String servletClass = childElement.elementText("servlet-class");
System.out.println("\t" + servletClass);
}
// #5.3 处理<servlet-mapping> 省略...
}
5、快捷查询方式
selector选择器
1、使用的方法:Elements select(String cssQuery)
2、语法:参考Selector类中定义的语法
XPath
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
1、使用Jsoup的Xpath需要额外导入jar包。
2、询w3cshool参考手册,使用xpath的语法完成查询
//1.获取student.xml的path
String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根据document对象,创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//4.结合xpath语法查询
//4.1查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.2查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.3查询student标签下带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.4查询student标签下带有id属性的name标签 并且id属性值为itcast
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}