文章目录
XML
概念:
可扩展标记型语言
标记型语言:
html就是标记型语言
可扩展:
html里面的标签是固定的,每个标签都有特定的含义
xml标签可以自己定义,可以写一些中文的标签
用途:
html使用来显示数据
xml也可以来显示数据,但是它的主要功能是为了存储数据
现在有两个版本,1.0和1.1,但是现在用的都是1.0,w3c组织发布的一个技术
xml的应用
1、不同的系统之间传输数据
QQ之间的传输的过程:qq消息之间的传输格式,首先在最早的时候,用的是一个字符串来传输数据的,之间有一个传输的规则,程序的可维护性太差了。程序员1开发了这个代码,程序员2看到代码就不知道是什么含义,比如想对程序做一个扩展,增加一个ip地址,别的程序员也看不懂。
后来就使用了xml,
String s = "
<message id = "1">
<sender>10000</sender>
<getter>2000</getter>
</message>
"
有利于程序的维护
2、用来表示生活中有关系的数据
<中国>
<北京>
<海淀></海淀>
<丰台></丰台>
</北京>
</中国>
3、经常用于配置文件
比如现在连接数据库,肯定要知道数据库的用户名和密码,数据名称
如果要修改数据库的信息,就不需要修改连接数据库的信息,直接修改配置文件的内容就好
xml语法
1、xml文档声明
创建一个文件,后缀名是.xml
必须写文档声明,表示写xml文件的内容(必须写在第一行第一列)
<?xml version="1.0" encoding="UTF-8"?>
属性:
version:版本:1.0 1.1 一般使用1.0
encoding:编码的格式,gbk中文简体、utf-8、iso8859-1不包含中文
standalone:值是yes或者no,是否需要依赖其他文件
xml中文的乱码问题:
保存到本地硬盘的时候,文件定义的编码格式和文件存储的格式不一致
2、定义元素(标签)
标签必须有开始和结束
标签可以包含标签的主体,如果标签不含主体,可以在标签内结束
<person></person>
<person/>
标签可以嵌套
<aa>
<bb></bb>
</aa>
一个xml文件有且只有一个根标签,其他的标签都是其下面的标签
在xml中,空格和换行也要被解析,所以在xml代码编写中,不要加多余的空格和换行
<name>刘锋</name>
<name>
刘锋
</name>
<!--这两段代码的含义是不一样的-->
命名规则:
1、区分大小写
2、不能数字或者下划线_开头
3、不能以xml、XML开头
4、不能有空格和冒号
5、可以是中文,不推荐
3、定义属性
<person id1="aaa" ,id2="222"></person>
1、一个标签上可以有多个属性
2、属性名称不能相同
3、属性值一定要用单引号或者双引号引起来
4、属性的命名规范和元素的规范是一致的
4、注释
<!--这是一个注释-->
5、特殊字符
显示结果 | 描述 | 转义字符 | 十进制 |
---|---|---|---|
空格 | |||
< | 小于号 | < | < |
> | 大于号 | > | > |
& | 与号 | & | & |
" | 双引号 | " | " |
’ | 单引号 | ' | ' |
× | 乘号 | × | × |
÷ | 除号 | &divde; | ÷ |
6、CDATA区
解决多个字符频繁转义的操作
写法:
<![CDATA[内容]]>
<![CDATA[<>!@#$%^&*()]]>
7、处理指令(PI指令)
可以在xml中设置样式
XML约束
DTD(Document Type Definition)
简介
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
分类
DTD可以分为两种:内部DTD、外部DTD
使用
内部
<!DOCTYPE 根元素 [元素声明]>
元素声明语法
<!ELEMENT 元素名 (子元素1,子元素2,子元素3,子元素4,...)>
数量词
+: 表示出现一次或者多次,至少出现一次
?: 表示出现0次或者1次
*: 表示出现任意次
属性声明语法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
属性的类型:
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1|en2|…) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
值 | 解释 |
---|---|
值 | 属性的默认值 |
#REQUIRED | 属性值是必需的 |
#IMPLIED | 属性不是必需的 |
#FIXED value | 属性值是固定的 |
<!DOCTYPE scores[
<!ELEMENT scores (student+)>
<!ELEMENT student (name,cores,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT cores (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
外部
引入本地:
引入网络:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student+)>
<!ELEMENT student (name,cores,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT cores (#PCDATA)>
<!ELEMENT score (#PCDATA)>
缺陷:
不可以约束内容
XSD(XML Schema Definition)
是DTD的替代者
不仅可以定义XML文档的结构,还能规范文档的内容
XSD本身也是XML文档
XSD采用XML文档来定义语义约束,比DTD要复杂,但是功能要比DTD强大
支持丰富的数据类型
允许开发者自定数据类型
可读性强
可针对未来的需求进行扩展
XML解析技术
就是对xml进行操作,包括创建xml,对xml文件进行增删查改
常见的xml解析技术:
1、dom解析
就是官方(sun)提供的解析方法,基于xml树,适用于多次访问xml
2、SEX解析
民间的解析方式,基于事件的解析方式,消耗的资源少,使用与数据量较大的xml
3、JDMO解析
开放源代码的,比dom更快
4、DOM4J解析
DOM4J说明文档
https://blog.csdn.net/qq_41860497/article/details/84339091
第三方提供,开源免费,是JDOM的升级版,使用的是接口,而不是实现类
DOM4J解析XML
1、生成xml文件
2、将信息从xml文件中取出
解析xml入口是一个对象,得先拿到一个Document对象
读取xml文件的信息
// 创建SAXreader对象,用于读取xml文件
SAXReader reader = new SAXReader();
// 读取xml文件,得到document文件
Document document = reader.read(new File("xml\\src\\DTD约束\\scores.xml"));
System.out.println(document);
// 获取根元素
Element rootElement = document.getRootElement();
String name = rootElement.getName();
System.out.println(name);
// 获取根元素下的所有子元素 student
Iterator<Element> iterator = rootElement.elementIterator();
while (iterator.hasNext()) {
Element next = iterator.next(); // student
// 获取每个student的属性
Attribute id = next.attribute("id");
// 属性的值
String value = id.getValue();
// 属性的名字
String name1 = id.getName();
// 打印输出每一个student的id属性的信息
System.out.println(name1 + " = " + value);
// // 获取student元素下的所有子元素
// Iterator<Element> iterator1 = next.elementIterator();
// while (iterator1.hasNext()) {
// Element next1 = iterator1.next();// name cores score
// Object data = next1.getData();
// String name2 = next1.getName();
// // 打印 name cores score内容
// System.out.println(name2+" : "+data);
// }
// 获取特定的子元素
Element name2 = next.element("name");
String name3 = name2.getName();
// 获取值的第一种方法
// String value1 = name2.getStringValue();
// 获取值的第二种方法
String text = name2.getText();
// 获取值的第三种方法
Object data = name2.getData();
System.out.println(name3 + " : " + data);
}
DOM4J生成xml
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType"/>
<xsd:element name="sex" type="sexType"/>
</xsd:sequence>
<xsd:attribute name="number" type="number"/>
</xsd:complexType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="90"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="number">
<xsd:restriction base="xsd:string">
<xsd:pattern value="stu_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
引入xsd
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn student.xsd">
<student number="stu_1525">
<name>刘锋</name>
<age>2</age>
<sex>male</sex>
</student>
</students>
jsoup解析XML
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM、CSS 以及类似于 JQuery 的操作方法来取出和操作数据。
也可以用来解析xml
导入jar包
// 获取document对象,根据一个xml文档获取
// 获取book3.xml的path路径
String path = JsoupDocumentTest01.class.getClassLoader().getResource("book3.xml").getPath();
// 中文文件名出现乱码的解决办法
path = java.net.URLDecoder.decode(path, "utf-8");
// 解析xml或者html文件
Document document = Jsoup.parse(new File(path), "utf-8");
// 获取元素对象
Elements book = document.getElementsByTag("book");
for (int i = 0; i < book.size(); i++) {
// 获取文本内容
String s = book.get(i).text();
System.out.println(s);
/**
* 获取网页的document(java爬虫)
*/
@Test
public void getUrlElement() {
try {
URL url = new URL("https://www.taobao.com/");
Document parse = Jsoup.parse(url, 10000);
System.out.println(parse);
} catch (IOException e) {
e.printStackTrace();
}
}
selector选择器
String path = JsoupSelectorTest01.class.getClassLoader().getResource("book3.xml").getPath();
// 中文文件名出现乱码的解决办法
path = java.net.URLDecoder.decode(path, "utf-8");
Document document = Jsoup.parse(new File(path), "utf-8");
// 标签选择器
Elements bName = document.select("bName");
// System.out.println(bName);
// 和编写css的时候一样
Elements book_price = document.select("book price");
// System.out.println(book_price);
// id选择器
Elements select = document.select("#1 bName");
System.out.println(select);
Xpath解析
导入jar包