目录
一、XML介绍
XML:其全称---》可扩展的编辑(标签)语言。是一门独立的语言,有自己特有的语法规则。本质上是一个“纯文本文件”。XML的设计宗旨是传输数据,而非显示数据,并且XML标签没有被预定义,我们可以自行定义标签
二、XML语法
XML语法的主要组成:文档声明、标签、属性、注释、转义字符和CDATA区
1、文档声明
格式:
<?xml version = “1.0(或者1.1)" encoding = “UTF-8" ?>
作用:
文档声明是给XML文件的编辑器、解析器看的,用于识别XML的版本语法,以及编码方式等。
注意事项:
1、一个标准的XML文档通常会在0行0列的位置定义
2、文档声明并非必须的
2、标签(元素)
标签:也叫“标记、元素”,是XML的重要组成部分
格式:
1)完整标签:----》 <name>James<name>
2)单标签 (自闭和标签) :----》 <student 属性=“属性值” age="18"/>无标签体
注意事项:
1)标签的名称只能包含:字母(包括中文)、数字、四个符号(_、-、:、.)
2)数字、符号不能开头,中间不能有“空格”[尽量以英文开头,英文结束,不携带中文,数字,符号等]
3)XML的标签区分大小写
4)标签可以嵌套
示例:
<students>
<student>
<name>张三</name>
</student>
</students>
3、属性
格式:
任何标签都可以定义属性,完整标签只能写在开始标签中,自闭和标签不能写在/后
注意事项:
1)属性值必须用一对双引号或者单引号括起来
2)一个标签可以有多个属性,但是不能重名
3)一个标签可以定义多个属性,每个属性之间需要用“”空格“”隔开
<student id = “it001" name = “张三" age = “18" sex = “男"/>
4、注释
格式:
<!--注释内容-->
注意事项:
1)注释不能写在“标签名”的里面
2)主是不能嵌套
<!-- 学员信息-->
<students>
<student>
<!-- 学员信息-->
<name>张三</name>
<age>19</age>
</student>
</student>
5、CDATA区
在XML中,有一些特有的关键的符号,例如,(>、<、&等),这种字符,容易对XML的编码造成影响,一种解决方式是使用转定义符:常用的几种转定义符如下:
另一种解决方式就是将XML内容写在CDATA区中:
CDATA区中的内容全部认为是文本 没有特殊符号。
<![CDATA[
String str = “fjdsEFeafeEW1432”;
int count = 0;
for(int i = 0;i < str.length() ; i++){
char c = str.charAt(i);
if(c >= ‘0’ && c <= ‘9’){
count++;
}
}
System.out.println(“count = “ + count);
]]>
三、XML约束
XML约束:在我们应用XML过程中,XML应该被赋予一些约束,用来规范XML。在应用过程中,约束分为两种:一种是DTD约束,另一种数Schema约束。
DTD约束:属于旧版本的约束,语法简洁,功能比较单一,适用于一些小型的、简单的文档使用
schema约束:属于新版本约束,语法复杂,功能比较强大。适用于一些大型的、复杂的文档使用
约束可以用来约束:
1)文档中可以出现的标签 2)标签之间的包含关系
3)标签出现的顺序 4)标签出现的频率等等……
1、DTD约束
1.1文档格式
<?xml version="1.0" encoding="UTF-8" ?>
<!--
在需要使用此dtd的xml中引入约束
<!DOCTYPE 书架 SYSTEM "book.dtd">
-->
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
在XML中使用以下语句引入约束:
<!DOCTYPE 书架 SYSTEM "book.dtd">
然后可以开始写XML文件内容:
<?xml version="1.0" encoding="utf-8" ?><!--文档声明-->
<!DOCTYPE 书架 SYSTEM "book.dtd"><!--引入DTD约束-->
<书架>
<书>
<书名></书名>
<作者></作者>
<售价></售价>
</书>
</书架>
1.2约束元素的理解
<?xml version="1.0" encoding="UTF-8" ?>
<!--
在需要使用此dtd的xml中引入约束
<!DOCTYPE 书架 SYSTEM "book.dtd">
-->
<!ELEMENT 书架 (书+)><!--约束根元素是“书架”,“书架的子元素为书,”,“+”为数量词-->
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
1.3标签类型
标签类型 | 代码写法 | 说明 |
PCDATA | (#PCDATA) | 被解释的字符串数据 |
EMPTY | EMPTY | 空元素 |
ANY | ANY | 任意类型 |
<!ELEMENT 售价 (#PCDATA)> <!--"售价"元素体为字符串数据-->
<!ELEMENT 出版日期 ANY> <!--"出版日期"元素体为任意类型-->
<!ELEMENT 版本号 EMPTY> <!--"版本号"元素体为空元素
1.4数量词
数量词符号 | 含义 |
* | 元素可以出现0~多个 |
+ | 元素可以出现1~多个 |
? | 元素可以是0或1个 |
, | 元素按照顺序显示 |
| | 元素需要选中其中某一个 |
1.5属性声明
<!ATTLIST 标签名称
属性名称 属性类型 属性说明>
属性类型 | 含义 |
CDATA | 属性是文本字符串 |
ID | 属性值唯一,不能以数字开头 |
ENUMERATED | 执行范围内进行枚举 |
属性说明 | 含义 |
#REQUIRED | 属性必须有 |
#IMPLIED | 属性可有可无 |
#FIXED | 属性固定值 |
<!ATTLIST 书 <!--设置"书"元素的的属性列表-->
id ID #REQUIRED <!--"id"属性值为必须有-->
编号 CDATA #IMPLIED <!--"编号"属性可有可无-->
出版社 (清华|北大|传智播客) "传智播客" <!--"出版社"属性值是枚举值,默认为“传智播客”-->
type CDATA #FIXED "IT" <!--"type"属性为文本字符串并且固定值为"IT"-->
>
2、schema约束
简单语法,后期在介绍
2.1文档格式
<?xml version="1.0" encoding="UTF-8" ?>
<!--
将注释中的以下内容复制到要编写的xml的声明下面
复制内容如下:
<书架 xmlns="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
>
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn"
elementFormDefault="qualified">
<xs:element name='书架' >
<xs:complexType>
<xs:sequence maxOccurs='unbounded' >
<xs:element name='书' >
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:double' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
schame约束:能够约束数据的类型
四、XML解析
1、三种解析方法
1、dom解析:一次性将文档的所有内容读取到内存中,并在内存中生成DOM树模型。
【优点:可以对元素进行增、删操作 缺点:处理慢、占用内存,只适用于小型文件】
2、SAX解析:一次读取一行,解析一行(只能读)
【好处:处理快,不占用内存 缺点:没有文档结构,不能对文档内容进行增、删操作】
3、PULL解析:Android的解析方式
2、解析工具
1)JAXP解析:JDK自带的解析工具,比较原始、底层,使用起来不方便
2)JSOUP解析:对HTML进行解析(网络爬虫)
3)JDOM解析:DOM4J的兄弟,功能比较弱小,很少使用
4)DOM4J解析:应用最广的一个XML解析工具,内部结合DOM和SAX解析方式
3、解析原理及结构模型
解析原理:XML DOM和HTML DOM一样,将XML文件加载到内存,生成一个DOM树,并获取一个Document对象,通过Document对象就可以对DOM进行操作,
结构模型:
4、DOM4J与XPath使用和方法
使用步骤:
1)dom4j是一个第三方的“软件包”
链接:https://pan.baidu.com/s/1SPxnd7yP_SsgygNKee9Qsw
提取码:kcv62)将dom4j的jar包复制到模块目录下,然后右键添加到类库(add as library)
4.1常用方法
方法 | 作用 |
new SAXReader | 创建saxreader对象(构造方法) |
Document read(string url) | 加载执行xml文档 |
方法 | 作用 |
Element getRootElement() | 获取根元素 |
方法 | 作用 |
List<Element> elements([String element]) | 获取根元素的子元素(可以指定也可以不指定根元素名称) |
Element element([String element]) | 获取第一个子元素(可以指定,也可以不指定元素名称) |
string getName() | 获取当前元素的名称 |
string attributeValue(string attrName) | 获取指定属性名的属性值 |
string elementText(string element) | 获取指定名称元素的文本值 |
string getText() | 获取当前元素的文本内容 |
public class Test {
public static void main(String[] args) throws DocumentException {
//3、利用类加载器创建InputStream流对象
InputStream in = Test.class.getClassLoader().getResourceAsStream("books.xml");
//1、创建saxReader对象
SAXReader saxReader = new SAXReader();
//2、读取xml文件,获取DOM对象
Document document = saxReader.read(in);
//4、获取XML文件的根目录
Element rootElement = document.getRootElement();
//5、通过根元素对象获取子元素对象
List<Element> listElements = rootElement.elements();
//6、遍历子元素对象
for (Element listElement : listElements) {
//获取子元素的id属性名
/*Attribute name = listElement.attribute("id");
String value = name.getValue();
System.out.println(value);
*/
//获取子元素的子元素
// List<Element> elements = listElement.elements();
// // //遍历子元素集合
// for (Element childElement : elements) {
// //获取指定标签的文本数据
// // System.out.println(childElement.getText());//1
// // System.out.println(childElement.getStringValue());//2
// }
//3、根据名称获取元素
Element name = listElement.element("name");
//根据元素获取标签数据
String text = name.getText();
//输出值
System.out.println(text);
// 4、
// System.out.println(listElement.elementText("name"));
}
}
}
4.2XPath使用
在DOM4J的基础上,在此导入jaxen-1.1-beta-6.jar包。
链接:https://pan.baidu.com/s/1Q5QgiVsdz-v1U-ThpC-gag
提取码:0lix
可以直接写出想要获取文本信息的路径,然后使用selectISingleNode就可以获取:
public class Test {
public static void main(String[] args) throws DocumentException {
//3、利用类加载器创建输出流对象
InputStream in = Test.class.getClassLoader().getResourceAsStream("books.xml");
//1、创建 Saxreader对象
SAXReader saxReader = new SAXReader();
//2、读取xml文件,获取DOM对象
Document document = saxReader.read(in);
//4、获取xml文件的根元素
Element rootElement = document.getRootElement();
//5、获取指定标签的文本数据
Node node = rootElement.selectSingleNode("/books/book/name");
//6、获取节点的文本数据并解析
System.out.println(node.getText());
}
}