XML简介:
xml概念:
Extensible Markup Language 可扩展标记语言,标签可扩展,即标签可自定义;xml可解决properties配置文件中属性重复导致不能确的问题,而xml可以解决这个问题,因为xml类型html具有结构化;xml在java中常用于存储配置信息;可在网络中传输。
html语法比较松散,而xml语法严格
html标签是预定义的,而xml标签是自定义的
html是做展示数据用,而xml标签是存储数据用
基本语法:
1.xml文件以xml后缀结尾。
2.xml文件第一行必须定义文声明。
3.xml文档中,有且必须有一个根标签。
4.xm文档中,属性必须使用引号引起来,单双都可以。
5.xml文档中,标签必须正确关闭。
6.xml文档中,标签名区分大小写。
XML组成部分:
1.文档声明:<?xml version='1.0' ?> 其属性有(version版本号,必须属性、encoding编码格式,告诉解析引擎使用的字符集、standalone是否独立,当xml文件依赖其他文件时可以设置为yes)
2.指令:可以引入css等文件
3.标签:不能以数字开头、但是可以包含数字,不能以xml字符开始、不能以标点符号开始、名称不能包含空格
4.属性: id属性值唯一
5.文本:CDATA区,在该区域中的数据会被原样展示,当文本中有特殊字符时,此时需要用到转义字符,如果不想使用转义字符,那么可以将代码放到CDATA区。
<?xml version='1.0' ?>
<!-- 2.文档申明:必须在文档的第一行,注释后面也不行,否则会报错,问号和尖括号之间不能有空格,否则会报错 -->
<!-- 引入一个css样式: css文件中正常写css代码即可,如选中name标签可用:name{ color: 'red'}-->
<?xml-stylesheet type='text/css' href='a.css' ?>
<!-- 3.一个根标签,被自定义为了users -->
<users>
<!-- 4.属性必须使用引号引起来 -->
<user id='1'>
<name>苦海123</name>
<age>18</age>
<gender>男</gender>
</user>
<user id='2'>
<name>苦海</name>
<age>25</age>
<gender>男</gender>
</user>
<code>
if (a > b) {}
<!-- CDATA区 -->
<![CDATA[
if (a > b) {}
]]>
</code>
</users>
XML由谁来编写,由谁来解析使用?
xml文件是由用户编写,供软件解析使用的,不过一般是不写xml文件的,一般能看懂就行。
约束文档:
XML文档的编写是有要求的,市面上常用的约束文档可分为大概如下几类:
1.DTD:一种简单的约束技术,示例如下:
// dtd约束文件student.dtd中代码示例:
<!ELEMENT students (student+) > // ELEMENT表示定义标签students(students下可以出现一个或多个student标签,加号这里实际是正则匹配,表示一次或多次),
<!ELEMENT student (name,age,sex)> // student标签下可以按顺序出现name,age,sex标签
<!ELEMENT name (#PCDATA)> // #PCDATA表示字符串
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> // 给student标签定义属性ID(number类型,且#REQUIRED必传)
// 需要编写的xml示例代码和步骤如下:
<?xml version="1.0" encoding="UTF-8" ?>
// 1.引入dtd文档:有两种方式:一、直接将dtd文档定义在xml文档中;二、将外部的dtd文档引入xml文档中。
<!DOCTYPE students SYSTEM "student.dtd"> // dtd文档路径可以是本地或网络地址,<!DOCTYPE students SYSTEM "student.dtd">表示xml根标签为students,SYSTEM为本地路径固定写法,"student.dtd"表示本地dtd约束文档路径、网络地址只需要将SYSTEM变为PUBLIC后,空格跟: "自定义一个dtd文件名" "dtd文件位置URL" ,如:<!DOCTYPE students PUBLIC "demo.dtd" "https:www.demo.com/test.dtd">
// 直接定义在xml文档中的方式:
<!DOCTYPE students [
粘贴student.dtd文档中的示例代码即可,不推荐此方式引入dtd约束文件,因为太臃肿了
]>
<students>
<student number="s001">
<name>zhangsan</name>
<age>abc</age>
<sex>hehe</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>24</age>
<sex>female</sex>
</student>
</students>
2.Schema:一种复杂的约束技术,弥补了dtd约束文档的缺陷(dtd文档标签中的内容无法约束),示例如下:
// student.xsd示例代码:
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/> // 定义了一个students标签,元素类型是自定义的studentsType类型
<xsd:complexType name="studentsType"> // 自定义元素类型studentsType:sequence表示按顺序出现student标签,元素的最少出现0次,最多不确定
<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="numberType" use="required"/> // 必传属性number,类型为自定义numberType
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType"> // 自定义numberType约束
<xsd:restriction base="xsd:string">
<xsd:pattern value="kuhai_\d{4}"/> // pattern表示组成格式:kuhai_数字
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
//对应的xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个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">
<student number="kuhai_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
解析xml:
操作xm文档,将文档中的数据读取到内存中,或将内存中的数据写入xml文档。
xml的解析方式:
1.DOM:将标记语言文档一次性加载,在内存中会行程一个dom树。操作dom的优点:操作方便,可以对文档进行CRUD操作,缺点:dom设计不合理的话会非常占内存(常用语pc端)。
2.SAX: 逐行读取,读一行释放一行,基于事件驱动,优点:不怎么占内存(移动端多用SAX),缺点:只能读取,不能增删改。
xml解析器:
1.JAXP: sun公司提供的解析器,支持dom和sax两种思想,比较耗性能。
2.DOM4J:一款非常优秀的解析器。
3.jsoup: 是一款java的html解析器,可直接解析url地址,html文档内容,他提供了一套非常省力的api,可以通过dom,css以及类似于jQuery的操作方法来取出和操作数据,这里主要介绍这一款。
4.PULL: Android操作系统内置解析器,sax方向。
jsoup解析器:
具体使用步骤如下:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class JsoupTest {
// 1.在项目根目录下新建一个文件夹libs,并将jsoup-1.16.1.jar包导入到libs目录下,并将其添加为库文件...(jsoup下载可到官方网址进行下载:https://jsoup.org/download, jsoup常用于爬虫):
public static void main(String[] args) throws IOException {
// 2.获取Document对象,根据xml文档获取(手写一个简单的xml文件,这里我使用了之前的students.xml文档):Jsoup下面有一个方法parse方法,此方法接收一个文件对象(除文件对象外还支持xml或html的字符串或url,当url链接时,第二个参数为超时毫秒值)和字符集编码:
// 2-1.获取student.xml路径:
String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
// 2-2.解析xml文档,加载文档进内存,获取dom树:Document
Document document = Jsoup.parse(new File(path), "utf-8");
System.out.println(document); // 以字符串的形式返回xml文档内容:
// 3.获取元素对象Element:getElementsByTag用来获取标签名为name的元素,这里和JavaScript操作document中node节点一样,方法也基本都一样。
Elements elements = document.getElementsByTag("name");
System.out.println(elements); // 获取到了两个name标签的内容
Element element = elements.get(0);
System.out.println(element);
String name = element.text();
System.out.println(name); // 张 三
};
// Jsoup:一个工具类,可以解析html或xml文档,返回Document
// Document:文档对象,代表内存中的dom树
// Elements:元素Element对象的集合,可以当做ArrayList<Element>来使用
// Element: 元素对象
// Node: 节点对象
}
提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者 删除。
笔者:苦海123
其它问题可通过以下方式联系本人咨询:
QQ:810665436
微信:ConstancyMan