XML基本介绍
- XML即可扩展标记语言(Extensible Markup Language)
- W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。
- 可扩展的, 标签都是自定义的
- 语法十分严格
XML的作用
功能 | 说明 |
---|---|
存储数据 | 通常,我们在数据库中存储数据。不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中 |
配置文件 | 作为各种技术框架的配置文件使用 (最多) |
在网络中传输 | 客户端可以使用XML格式向服务器端发送数据,服务器接收到xml格式数据,进行解析 |
XML的语法
- 文档声明必须为结束;
- 文档声明必写在第一行;
- 语法格式:
<?xml version="1.0" encoding="UTF-8"?>
- 属性说明:
versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
encoding:指定当前文档的编码。可选属性,默认值是utf-8;
元素
Element 元素: 是XML文档中最重要的组成部分
元素的命名规则
- 不能使用空格,不能使用冒号
- xml 标签名称区分大小写
- XML 必须有且只有一个根元素
语法格式:<users></users>
- XML 必须有且只有一个根元素,它是所有其他元素的父元素
<?xml version="1.0" encoding="utf-8" ?>
<users>
</users>
- 普通元素的结构开始标签、元素体、结束标签组成。
<hello> 大家好 </hello>
- 元素体:元素体可以是元素,也可以是文本
<hello>
<a>你好</a>
</hello>
- 空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合
<close/>
属性
<bean id="" class=""> </bean>
- 属性是元素的一部分,它必须出现在元素的开始标签中
- 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
- 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
- 属性名不能使用空格、冒号等特殊字符,且必须以字母开头
注释
XML的注释,<!-- 注释的内容 -->
。注释内容会被XML解析器忽略
使用XML 描述数据表中的数据
<?xml version="1.0" encoding="utf-8" ?>
<employees>
<employee eid="2">
<ename>林黛玉</ename>
<age>20</age>
<sex>女</sex>
<salary>5000</salary>
<empdate>2019-03-14</empdate>
</employee>
<employee eid="3">
<ename>杜甫</ename>
<age>40</age>
<sex>男</sex>
<salary>6000</salary>
<empdate>2020-03-14</empdate>
</employee>
</employees>
XML约束
- 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
- 常见的xml约束:
1、DTD
2、Schema - 作为程序员只要掌握两点
1、会阅读
2、会引入
3、不用自己编写
XML 解析
当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用Java基础所学习的IO知
识是可以完成的,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。
人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML。
XML解析方式
开发中比较常见的解析方式有两种,如下:
DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
缺点:XML文档过大,可能出现内存溢出显现。
SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
优点:占用内存少 处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源。
XML常见的解析器
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包
- JAXP:sun公司提供的解析器,支持DOM和SAX两种思想
- DOM4J:一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
- Jsoup:jsoup 是一款Java 的HTML解析器 ,也可以解析XML
- PULL:Android内置的XML解析方式,类似SAX。
dom4j 的使用
API介绍
- 使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素,然后就可以操作了
- 常用API如下:
- SaxReader对象
read(…) 加载执行xml文档 - Document对象
getRootElement() 获得根元素 - Element对象
elements(…) 获得指定名称的所有子元素。可以不指定名称
element(…) 获得指定名称的第一个子元素。可以不指定名称
getName() 获得当前元素的元素名
attributeValue(…) 获得指定属性名的属性值
elementText(…) 获得指定名称子元素的文本值
getText() 获得当前元素的文本内容
约束:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="http://www.lagou.com/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.lagou.com/xml"
elementFormDefault="qualified">
<xsd:element name="users" type="usersType"/>
<xsd:complexType name="usersType">
<xsd:sequence>
<xsd:element name="user" type="userType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="userType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType"/>
<xsd:element name="hobby" type="hobbyType"/>
</xsd:sequence>
<xsd:attribute name="id" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="hobbyType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="抽烟"/>
<xsd:enumeration value="喝酒"/>
<xsd:enumeration value="烫头"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
xml:
<?xml version="1.0" encoding="UTF-8" ?>
<users xmlns="http://www.lagou.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.lagou.com/xml user.xsd" >
<user id="001">
<name>张三</name>
<age>20</age>
<hobby>抽烟</hobby>
</user>
<user id="002">
<name>李四</name>
<age>22</age>
<hobby>喝酒</hobby>
</user>
<user id="003">
<name>王五</name>
<age>24</age>
<hobby>烫头</hobby>
</user>
</users>
Java:
public class TestDOM4j {
public static void main(String[] args) throws DocumentException {
// 1.创建SAXReader对象
SAXReader saxReader = new SAXReader();
// 2.解析XML,获取文档对象Document
Document read = saxReader.read("F:\\lagouProjects\\2_3\\src\\com\\lagou\\xml\\user.xml");
// 3.获取根元素
Element rootElement = read.getRootElement();
// 获取根元素名称
System.out.println(rootElement.getName());
// 获取根元素下的所有标签
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println("根元素下的子节点名称:" + element.getName());
System.out.println("user标签的属性值:" + element.attributeValue("id"));
System.out.println("user标签的属性名:" + element.attribute("id").getName());
// 获取子节点下的标签
List<Element> subElements = element.elements();
for (Element subElement : subElements) {
System.out.println("user标签下的子节点名称:" + subElement.getName());
System.out.println("当前元素的文本内容:" + subElement.getText());
}
break;
}
}
}