目录
1、XML简介
1.1、什么是XML?
XML 指可扩展标记语言(EXtensible Markup Language)。
XML 是一种很像HTML的标记语言。
XML 的设计宗旨是传输数据,而不是显示数据。
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准。
1.2、XML和HTML之间的区别?
XML不是HTML的替代,XML被设计是用来传输和存储数据的,其重点是数据的内容。
而HTML被设计是用来显示数据的,其重点是数据的外观样式。
XML 是独立于软件和硬件的信息传输工具
1.3、XML的作用
通常会把xml当作一个配置文件去使用。(在Spring Struts Hibernate Springmvc Mybatis等框架中作为配置文件)。
1.4、XML自定义标签
标签没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由 XML 文档的创作者发明的。XML 语言没有预定义的标签。HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p>、<h1> 等等)。XML 允许创作者定义自己的标签和自己的文档结构。
2、XML的语法结构
2.1、XML命名规则
XML 元素必须遵循以下命名规则:
1、名称可以包含字母、数字以及其他的字符。
2、名称不能以数字或者标点符号开始。
3、名称不能以字母 xml(或者 XML、Xml 等等)开始。
4、名称不能包含空格。
5、可使用任何名称,没有保留的字词。
最佳命名习惯
使名称具有描述性。使用下划线的名称也很不错:<first_name>、<last_name>。
名称应简短和简单,比如:<book_title>,而不是:<the_title_of_the_book>。
避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为您想要从 first 里边减去 name。
避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。
避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。
XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的命名规则来命名 XML 文档中的元素。
在 XML 中,éòá 等非英语字母是完全合法的,不过需要留意,您的软件供应商不支持这些字符时可能出现的问题。
2.2、XML声明
XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:
<!--声明xml文件,设置xml文件的编码,版本的信息-->
<?xml version="1.0" encoding="utf-8"?>
2.3、XML元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
写法:<标签名>
在xml中,同样的去区分单标签和双标签
单标签 :<标签名 />
双标签:<标签名> 内容(文本,其他标签) </标签名>
标签名是我们自己定义的。建议大家。采用标识符的命名规则去给一个标签起名字。(数字字母下划线,并且数字不能作为开头)
案例:
描述 书籍的信息。书名字,作者,单价。
标签的书写注意事项:
1、xml中的所有标签必须闭合。
2、xml中的标签名称严格区分大小写。<User> <user>
3、在xml标签名中间不要书写空格,或者 冒号 逗号 等符号。
标签的名字不要有空格一类特殊符号。
4、标签名不要以数字开始。(可以按照标识符的方式给标签去命名)
5、书写xml标签时 ,标签不能互相嵌套。
<age>23<name>zhangsan></age></name>
6、所有的xml文件只能有一个根标签。
7、我们可以通过浏览器来校验xml文件的格式是否正确。
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<name>三国演义</name>
<author>罗贯中</author>
<price>39.9</price>
<version>1.0</version>
</book>
</books>
2.4、XML注释
xml中的注释和html中的注释的写法是一样的。
<!-- 内容--> -------本身就是多行注释了。
注意:注释的内容,会在浏览器中显示出来。
书写注释的时候,内容尽可能的去避免 -- 字符
<!--
1、每一个xml,有且只有一个根标签,所有xml标签必须写在根标签中
2、标签必须要有合闭
3、xml格式是否正确,可以通过浏览器打开xml。来校验xml格式是否正确
4、xml是区别大小写的
5、xml书写标签名时,不要出现空格等特殊字符
6、标签命名时不要以数字开头
7、在书写标签中时不要乱嵌套或相互嵌套 <name><age></name></age>
-->
2.5、XML属性
属性:书写在标签内的。对标签的数据进行扩展。对标签的进一步描述。
写法:<标签名 属性名=“属性值” 属性名=“属性值”> </标签名> 属性名也是自定义的。
注意问题:
1、如果是双标签,属性要书写在开始标签内
2、属性名不要出现空格,“;”“:” 特殊字符不要出现。
3、属性值必须用单引号,或者双引号包围起来。
2.6、CDATA区
CDATA区:可以输出特殊字符:原样的显示书写在CDATA的内容。会原封不动的显示出去。
我们可以使用预定义的实体,去替代一些特殊字符的输出。
注意实体的写法:&实体的名字;
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
&apos ; | ' | 单引 |
" ; | "" | 双引 |
<books>
<book>
<name>西游记</name>
<!--
为author添加扩展信息, 如:name , age 等
1、多个属性之间用空间分隔
2、属性要书写在开始标签内
3、在xml中属性一定要用双引或单引,引起来
4、属性名要按命名规则来
-->
<author sex="男" address="郑州"><吴承恩></author>
<pirce>50</pirce>
<version>1.2</version>
</book>
</books>
3、XML约束
什么是XML约束:对xml中的内容进行限制哪些怎么写有一定的约束限制,其实后面我都都是把xml作为配置文件来使用,所以我必须得看的懂xml中约束。
DTD目的: 可以看懂DTD文件,基于这个DTD文件可以写一个符合约束的xml文件。
XML约束分为两种: DTD约束、 Schema约束。
3.1、DTD约束
元素定义
语法 | 关键字 | 作用 | 示例 |
---|---|---|---|
<!ELEMENT 节点名称 (#PCDATA)> | #PCDATA | 代表文本元素,里面的内容必须是文本 | <!ELEMENT name (#PCDATA)> |
<!ELEMENT 节点名称 EMPTY> | EMPTY | 不能包含任何子元素和文本,仅可以使用属性 | <!ELEMENT version EMPTY> |
<!ELEMENT 节点名称 (e1,e2)> | (e1,e2) | 代表混合元素,表示这个标签里面还有其他的节点 | <!ELEMENT person (name,age,contact,br*)> |
元素的限制
限制 | 格式 |
---|---|
元素可以出现的次数 | 0或1:? 0~N:* 1~N:+ |
这个的元素次数指的是:例如下面案例books根目录下book这个标签能够出现的次数。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE books [
<!--定义根标签books-->
<!ELEMENT books (book*)>
<!--定义book标签中的子类标签-->
<!ELEMENT book (name,author,price,version)>
<!--子类标签name,其特性为#PCDATA,文本内容-->
<!ELEMENT name (#PCDATA)>
<!--子类标签author作者-->
<!ELEMENT author (#PCDATA)>
<!--子类标签 price价格-->
<!ELEMENT price (#PCDATA)>
<!--版本 这里特性为空值-->
<!ELEMENT version EMPTY>
]>
<books>
<!--因为book是*,所以可以0次,可以多次-->
<book>
<name></name>
<author></author>
<price></price>
<version/>
</book>
</books>
当在xml文件中加入<!DOCTYPE>约束后,输入标签<books>时会自动导入其子类标签。
3.2、DTD约束抽取
把DTD约束写到一个xml文件中有个弊端,就是只能这一个文件能够使用,为了方便以后多个文件可以共有这个DTD约束,我们需要把约束写到单独的一个.dtd文件中。
book.dtd文件
<!--定义根标签books-->
<!ELEMENT books (book*)>
<!--定义book标签中的属性标签-->
<!ELEMENT book (name,author,price,version)>
<!--属性标签name,其特性为#PCDATA,文本内容-->
<!ELEMENT name (#PCDATA)>
<!--属性标签author作者-->
<!ELEMENT author (#PCDATA)>
<!--属性标签 price价格-->
<!ELEMENT price (#PCDATA)>
<!--版本 这里特性为空值-->
<!ELEMENT version EMPTY>
books.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--引入外部DTD文件-->
<!DOCTYPE books SYSTEM "book.dtd">
<books>
<book>
<name>西游记</name>
<author>吴承恩</author>
<price>29.9</price>
<version/>
</book>
<book>
<name>水浒传</name>
<author>施耐庵</author>
<price>39.9</price>
<version/>
</book>
</books>
3.3、DTD的属性
定义标签中的属性
attribute list ,可以定义多个属性,为一个标签定义多个属性。
标签名:属性属于那个标签的。
<!ATTLIST 标签名
属性名 属性的类型(CDATA (EN1|EN2) ) 属性的约束(REQUIRED)为了便于阅读。把多个属性进行换行。
属性名 属性的类型 属性的约束
属性名 属性的类型 属性的约束
值 | 解释 |
---|---|
CDATA | 表示文本 |
#REQUIRED | 属性是必须的 |
#IMPLIED | 属性非必须的 |
#FIXED | 属性为固定字符串值 |
book.dtd文件
<!--定义根标签books-->
<!ELEMENT books (book*)>
<!--定义book标签中的属性标签-->
<!ELEMENT book (name,author,price,version)>
<!--属性标签name,其特性为#PCDATA,文本内容-->
<!ELEMENT name (#PCDATA)>
<!--属性标签author作者-->
<!ELEMENT author (#PCDATA)>
<!--属性标签 price价格-->
<!ELEMENT price (#PCDATA)>
<!--版本 这里特性为空值-->
<!ELEMENT version EMPTY>
<!--name属性是必须的-->
<!--age属性是必须的-->
<!--sex属性不是必须的-->
<!--sco的值是固定100-->
<!ATTLIST author
name CDATA #REQUIRED
age CDATA #REQUIRED
sex CDATA #IMPLIED
sco CDATA #FIXED "100"
book.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--引入外部DTD文件-->
<!DOCTYPE books SYSTEM "book.dtd">
<books>
<book>
<name>西游记</name>
<author name="吴承恩" age="48" sex="男" sco="100">吴承恩</author>
<price>29.9</price>
<version/>
</book>
<book>
<name>水浒传</name>
<author name="施耐庵" age="58" sex="男" sco="100">施耐庵</author>
<price>39.9</price>
<version/>
</book>
</books>
3.4、Schema约束
1、XML Schema是基于 XML 的 DTD 替代者。
2、XML Schema 符合XML语法结构,并且是可扩展的,后缀名为.xsd(xml schema document)。
3、XML Schema更容易地描述允许的文档内容,以及约束定义, 并支持名称空间。
配置xsd文件
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.example.org/bookSchema"
targetNamespace="http://www.example.org/bookSchema"
elementFormDefault="qualified">
<!--
xmlns:xs="http://www.w3.org/2001/XMLSchema" 约束XML里使用xs:作前缀的元素、属性、类型等名称的变量是属于
xmlns="http://www.example.org/bookSchema" 表示默认的命名空间是,也就是指定未使用任何前缀的元素、数据的命名空间为它.
targetNamespace="http://www.example.org/bookSchema" 显示被此 schema 定义的元素来自命名空间
elementFormDefault="qualified" 所有全局元素的子元素将被以缺省方式放到无名命名空间
-->
<xs:element name='books'>
<xs:complexType>
<!-- minOccurs/maxOccurs:指定元素出现的次数-->
<!-- minOccurs:限制最小出现次数,0表示不限制 -->
<!-- maxOccurs:限制最大出现次数,unbounded表示无限制 -->
<xs:sequence maxOccurs='unbounded '>
<xs:element name='book'>
<xs:complexType>
<xs:sequence>
<!--定义name标签-->
<xs:element name='name' type="xs:string"/>
<!--定义author标签-->
<xs:element name="author" >
<!--定义author标签的属性-->
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!--定义price标签-->
<xs:element name='price' type="xs:double"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
引入xsd文件
<?xml version="1.0" encoding="UTF-8" ?>
<books xmlns="http://www.example.org/bookSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/bookSchema book.xsd">
<book>
<name>红楼梦</name>
<author>曹雪芹</author>
<price>29.9</price>
</book>
<book>
<name>三国演义</name>
<author>罗贯中</author>
<price>39.9</price>
</book>
</books>
4、数据解析及常见解析XML方式
4.1、DOM方式
DOM(Document Object Model). 是用与平台和语言无关的方式表示XML文档的官方W3C标准,将标记语言文档一次性加载进内存,在内存中形成一颗dom树。
优点
操作方便,可以对文档进行CRUD的所有操作
缺点
通常需要加载整个XML文档来构造层次结构,消耗资源大。
4.2、SAX方式
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。逐行读取,基于事件驱动的。
什么是事件驱动:一种基于回调机制的程序运行方法。由外至内一层一层解析。
优点
①不需要等待所有数据都被处理,分析就能立即开始。 ②只在读取数据时检查数据,不需要保存在内存中。 ③可以在某个条件得到满足时停止解析,不必解析整个文档。 ④效率和性能较高,能解析大于系统内存的文档。
缺点
只能读取,不能增删改
很难同时访问同一文档的不同部分数据,不支持XPath
4.3、JDOM方式
JDOM(Java-based Document Object Model)的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。
优点
①使用具体类而不是接口,简化了DOM的API。 ②大量使用了Java集合类,方便了Java开发人员。
缺点
①没有较好的灵活性。 ②性能较差。
4.4、DOM4J
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。性能优异功能强大简单易用开放源代码。
优点
①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。 ②支持XPath。 ③有很好的性能。
缺点
大量使用了接口,API较为复杂
接下来我就演示一下使用DOM4J读取一下xml文件里的内容输出到控制台。
首先我们需要在目录下创建一个lib包,把下面的链接地址中的jar包放到lib包内,并手动添加到模块。
DOM4J的jar包链接如下:
链接:https://pan.baidu.com/s/1gwt_vNjALoae1ZsfKh-t_Q?pwd=6ly7
提取码:6ly7
Book.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id="1">
<name>西游记</name>
<author>吴承恩</author>
<price>29.9</price>
<version/>
</book>
<book id="2">
<name>水浒传</name>
<author>施耐庵</author>
<price>39.9</price>
<version/>
</book>
</books>
测试类
public class DOMTest {
public static void main(String[] args) throws DocumentException {
SAXReader reader=new SAXReader();
Document document = reader.read("Book.xml");
//获取根目录元素对象
Element dom = document.getRootElement();
//获取所有根目录下的子节点
List<Element> elements = dom.elements();
for (Element element : elements) {
//输出子节点的属性id值
System.out.println(element.attributeValue("id"));
//输出name值
System.out.println(element.elementText("name"));
//输出author值
System.out.println(element.elementText("author"));
//输出price值
System.out.println(element.elementText("price"));
System.out.println("----------------");
}
}
}