XML可扩展文本标记语言
一、概述
1、概念
XML(Extensible Markup Language)即可扩展文本标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
2、作用
- 用来保存数据,而且这些数据具有自我描述性
- 它还可以作为项目或者模块的配置文件
- 可以作为网络传输数据的格式(JSON格式为主)
3、注释
XML和HTML一样,使用:< !- - html注释 - - >
二、语法
1、元素(标签)
概念
xml元素是指从(且包括)开始标签到(且包括)结束标签的部分。
命名规则
- 标签名称可以含字母、数字以及其他的字符(中文)
- 名称不能以数字或者标点符号开始
名称不能以字符“xml”(或者XML、Xml)开始【可以识别】- 名称不能包含空格
注意
xml中的元素(标签)既支持单标签,也支持双标签。
如< book >或< books ></ books>
1.单标签
* 格式:<标签名 属性=“值” 属性=“值”...... />
2.双标签
*格式:<标签名 属性=“值” 属性=“值”...... />文本数据或子标签</标签名>
2、语法规则(重点)
- xml文档的文件后缀为 .xml 格式
- xml第一行必须定义为文档声明
- xml文档有且仅有一对根标签(顶级标签)
- 所有xml元素必须有关闭标签(闭合,成一对)
- xml元素(标签)必须正确嵌套(和HTML一样)
- 属性值必须使用引号引起来
- xml中的特殊符号要用转义字符
- xml标签名区分大小写
特殊字符的实体引用:
示例:
<?xml verson="1.0" encoding="utf-8"?>
<!--以上为xml文件的头部声明-->
<books><!--books表示多个图书信息-->
<book sn="SN001"><!--book表示一个图书信息,SN表示图书序列号-->
<name>时间简史</name><!--图书名-->
<author>霍金</author><!--作者-->
<price>100</price><!--价格-->
</book>
</books>
头部声明的属性值有:
- version:版本号,必须的属性
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1。
- standalone:是否独立。取值:yes:不依赖其他文件。no:依赖其他文件。
3、文本区域(CDATA区)
CDATA语法可以告诉xml解析器:在CDATA里的文本内容,只是纯文本,不需要xml语法解析。
CDATA格式:
< ! [ CDATA [ 这里可以把你输入的字符原样显示,不会解析xml ] ]>
4、xml与html的区别
- XML标签都是自定义的,HTML标签是预定义。
- XML的语法严格,HTML语法松散。
- XML不是用来替换html的技术,它和HTML是分别为不同的目的而设计的。
- XML是包含和传输数据;HTML是显示数据。
三、XML验证
1、DTD(Document Type Definition)【过时】
作用: DTD定义了XML文件的结构;为XML文件提供语法与规则;保证了数据的正确交换。
定义区域: 1,在XML文件中;2,在XML文件外。
实体: 是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用,可在内部或外部声明。
DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
2、Schema(XML Schema Definition(XSD))
定义: 描述XML文档的结构,是基于XML的DTD的替代者。
作用: 1,可保护数据通信;2,是可扩展的(由XML编写)。
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
3、Schema与DTD的异同:
相同: Schema是DTD的继任者,它会在将来取代DTD。
不同: Schema可针对未来的需求进行扩展;基于XML编写;支持数据类型;功能更强大和完善。
四、XML解析(Schema规则)
1、引入Schema:
- 填写xml文档的根元素
- 引入xsi前缀. xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
- 引入xsd文件命名空间. xsi:schemaLocation=“http://www.itcast.cn/xml student.xsd”
- 为每一个xsd约束声明一个前缀,作为标识 xmlns=“http://www.itcast.cn/xml”
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml user.xsd">
2、解析介绍
方式
解析(读取):将文档中的数据读取到内存中。
写入:将内存中的数据保存到xml文档中。持久化的存储
解析xml的方式:
1.DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
* 优点:操作方便,可以对文档进行CRUD的所有操作
* 缺点:占内存
2.SAX:逐行读取,基于事件驱动的。
* 优点:不占内存。
* 缺点:只能读取,不能增删改
XML常见的解析器:
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:Android操作系统内置的解析器,sax方式的。
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
3、解析操作
步骤:
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
//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);
对象的使用:
1. Jsoup:工具类,可以解析html或xml文档,返回Document
* parse:解析html或xml文档,返回Document
* parse(File in, String charsetName):解析xml或html文件的。
* parse(String html):解析xml或html字符串
* parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
2. Document:文档对象。代表内存中的dom树
* 获取Element对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
3. Elements:元素Element对象的集合。可以当做 ArrayList<Element>来使用
4. Element:元素对象
1. 获取子元素对象
* getElementById(String id):根据id属性值获取唯一的element对象
* getElementsByTag(String tagName):根据标签名称获取元素对象集合
* getElementsByAttribute(String key):根据属性名称获取元素对象集合
* getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
2. 获取属性值
* String attr(String key):根据属性名称获取属性值
3. 获取文本内容
* String text():获取文本内容
* String html():获取标签体的所有内容(包括字标签的字符串内容)
5. Node:节点对象
* 是Document和Element的父类
快捷查询方式:
1. selector:选择器
* 使用的方法:Elements select(String cssQuery)
* 语法:参考Selector类中定义的语法
2. XPath: XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
- 使用Jsoup的Xpath需要额外导入jar包。
- 查询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);
}