XML
概念:可扩展标记语言。(可扩展:自定义标签)
-
功能:
- 储存数据
- 在网络中传输:用于系统与系统之间的数据传输。
-
优点:
- 阅读性强(能描述数据间的结构关系)
-
语法:
<?xml version='1.0' ?> <users> <user> <name>zhangsan</name> <age>23</age> <gender>nan</gender> </user> <user> <name>lisi</name> <age>18</age> <gender>nv</gender> </user> </users>
xml文档的后缀名:.xml
xml第一行必须定义文档声明
有且仅有一个根标签
属性值必须使用引号(单双都可以)引起来
标签必须正确关闭
==区分大小写==
-
组成部分:
- 文档声明:xml文件编码要与encoding制定的码表编码一致。
<?xml 属性列表 ?> ★ version:版本号 ★ encoding:编码方式(当前文档使用的字符集,默认值iso-8859-1) ★ standalone:是否独立 取值: *yes:不依赖其他文件 *no :依赖其他文件
指令:结合css(不用了)
-
标签:自定义
规则:①名称不能以数字或者标点符号开始。
②名字可以包含字符,数字和其他符号。
③名称不能以字母xml开始。
==④名称不能包含空格。==
属性:id属性值唯一
-
文本内容:
-
转义字符:标签体重出现特殊符号,,那么一定使用转义字符。
< : <; > : >;
-
CDATA区(文本区):
<![CDATA[数据]]> : xml解析器在解析字符区的内容的时候,全部内容都只会当成普通的文本去处理。即使出现了特殊的字符也会当成普通文本。
-
-
约束:规定xml文档的书写规则
-
分类:
- DTD文件约束:一种简单的约束
//外部DTD文件(约束文件)引入 <!DOCTYPE students SYSTEM "student.dtd"> //引入网络DTD文件 <!DOCTYPE 根标签 PUBLIC "dtd文件名" "url地址"> <!DOCTYPE students PUBLIC "student.dtd"> //在xml文件上编写DTD文件: <!DOCTYPE 根标签 >
-
- **Schema**:一种复杂的约束
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<students
xmlns:aa="http://www.w3.org/2001/XMLSchema-instance"
aa:schemaLocation="http://www.itcast.cn/xml student.xsd"
xmlns="http://www.itcast.cn/xml">
<student number="heima_0001">
<name>zhangsan</name>
<age>18</age>
<sex>female</sex>
</student>
<student number="heima_0002">
<name>lisi</name>
<age>18</age>
<sex>female</sex>
</student>
</students>
```
- 使用方法:
1. 导入文件
```xml
<!--用于引入schemaLocation属性,固定的,可不变-->
xmlns:aa="http://www.w3.org/2001/XMLSchema-instance"
<!--指定schema文件位置,其中http://www.itcast.cn/xml中如果为无效路径,后面的student.xsd将提供本地的路径,如果前面网址有效,后面可不写。但是却不可以只写后面-->
aa:schemaLocation="http://www.itcast.cn/xml student.xsd"
<!--获取xds文件的路径-->
xmlns="http://www.itcast.cn/xml">
```
-
解析
-
操作文档:
- 解析(读取):将文档中的数据读取到内存中。
- 写入:将内存中的数据保存到xml文档中。持久化的储存
-
解析xml的两种思想(方式):
- DOM:将标记语言文档一次性全部加载进内存,在内存中形成一颗DOM树。
- 优点:操作方便,可以对文档进行CRUD的所有操作。
- 缺点:占内存
- SAX:逐行读取,基于事件驱动的。
- 优点 : 不占内存
- 缺点:只能读取内存,不能增删改查。
- DOM:将标记语言文档一次性全部加载进内存,在内存中形成一颗DOM树。
常见解析器
- jaxp sun公司研发的,使用比较复杂,而且性能较差,支持sax与dom的思想。
- dom4j : 使用了dom的思想,非常好用
- jsoup: 非常好用, 使用dom思想, 支持选择器查找标签。
- pull : android系统上自带一款解析。 sax思想。
解析器soup
- 使用步骤:
- 导包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
public static void main(String[] args) throws IOException {
// 获取路径 ,其中getResource()方法中传入的参数是xml的路径
String path = demo1.class.getClassLoader().getResource("student.xml").getPath();
// 获取Document对象,解析xml文档,加载文档进内存,获取DOM树
Document document = Jsoup.parse(new File(path), "utf-8");
// 获取元素对象Elements,这个对象继承了ArrayList集合
Elements elements = document.getElementsByTag("name");
// 获取elements中的第一个对象
Element elementFirst = elements.get(0);
// 获取数据
String name = elementFirst.text();
System.out.println(name);
}
==注意:获取路径的时候有两种写法:==
- 写法一:
String path = demo1.class.getClassLoader().getResource("student.xml").getPath();
==使用getClassLoader方法来传入xml文件路径的方式,xml文件必须要在src文件夹下,不能放到其他的文件夹中。==
- 写法二:
String path = demo1.class.getResource("/schema/student.xml").getpath();
==直接通过类的字节码文件调用方法getResource()方法获取路径的方式,xml文件的路径写法为/xxx/xxx/student.xml,其中第一个/表示src文件夹.==
解析方式一:Element对象功能
public static void main(String[] args) throws IOException {
String path = Demo2.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//获取元素对象
Elements studentEle = document.getElementsByTag("student");
// 获取属性名为id的元素对象们-->方式一
Elements id = document.getElementsByAttribute("id");
System.out.println(id.text());
//获取 number属性值为heima_0001的元素对象-->方式一
Elements elementsByAttributeValue = document.getElementsByAttributeValue("number", "heima_0001");
String text1 = elementsByAttributeValue.text();
System.out.println(text1);
//获取id属性值的元素对象-->方式一
Element elementById = document.getElementById("1");
String text2 = elementById.text();
System.out.println(text2);
System.out.println("----------------------------------");
//根据属性名获取属性值
Element student1 = document.getElementsByTag("student").get(0);
String number = student1.attr("number");
System.out.println(number);
System.out.println("*************");
//获取文本内容
String text = student1.text();
String html = student1.html();
System.out.println(text);
System.out.println("**********************************");
System.out.println(html);
}
如何通过Element获取标签体与属性的数据
- 获取属性数据: attr(属性名) 指定属性获取属性值内容。
- 获取文本的内容:
- text() 获取的是对应元素的所有纯文本内容,包括子标签的文本内容。
- html()获取的是对应元素的所有纯文本内容,包括子标签的文本内容,与标签。
使用选择器解析
public static void main(String[] args) throws IOException {
//使用选择器解析
String path = Demo2.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//获取元素对象
Elements studentEle = document.getElementsByTag("student");
// 查询name标签
Elements elementsName = document.select("name");
System.out.println(elementsName);
System.out.println("--------");
// 查询查询id值为1的元素
Elements selectId = document.select("#1");
System.out.println(selectId);
System.out.println("******");
// 获取student标签并且number属性值为heima_0001
Elements select2 = document.select("student[number=\"heima_0001\"]");
System.out.println(select2.text());
}
小结
- 使用选择器查找元素使用哪个方法?
document.select(选择器)
-
选择器通过id、标签、属性的格式如何?
- document.select(标签名) 标签选择名
- document.select(#id) id选择器
- document.select(.className) 类选择器
- document.select(标签名[属性名=属性值]) 指定标签名与属性名属性值查找
- document.select(标签名[属性名]) 指定标签名与属性名查找
- document.select(parent child) 指定父元素找到所有的子孙元素
- document.select(parent child) 指定父元素找到所有的子孙元素
- document.select(parent >child) 指定父元素找到所有的子元素
xpath
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//1.获取student.xml的路径
String path = Demo4.class.getResource("/student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根据Document对象创建JXDocument对象(document对象作为参数)。
JXDocument jxDocument = new JXDocument(document);
// 查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("----------------------");
// 查询所有student标签下的name标签
List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode);
}
System.out.println("----------------");
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
}