XML
概述
是可扩展标记语言(EXtensible Markup Language)
标记:是指标签(Tag)/元素(Element),<标签名></标签名>
可扩展:标签我们可以随意定义
XML是传输数据,而非显示数据
XML与HTML的主要差异
- XML 不是 HTML 的替代。
- XML 和 HTML 为不同的目的而设计。
- XML主要用于保存和传输数据,HTML是显示数据。
XML文件案例实现
需求
编写xml文档,用于描述人员信息,person代表一个人员,id是人员的属性代表人员编号。
人员信息包括age年龄、name姓名、sex性别信息。
实现步骤
<?xml version="1.0" encoding="UTF-8" ?>
<person id="001">
<age>18</age>
<name>李四</name>
<sex>男</sex>
</person>
使用浏览器打开即可。
XML的作用
- XML可以存储数据(也可以传输数据,但是一般都用的json)
- XML也可以作为配置文件
XML语法学习
XML的组成元素
XML文件中常见的组成元素有: 文档声明、元素、属性、注释、字符区、转义字符。
文档声明
就是表明这是一个XML文件。文档声明必须写在XML文件的0行0列(左上角)
固定格式:
<?xml version="1.0" encoding="UTF-8" ?>
version代表xml的版本号,encoding是文件编码。
元素Element/标签(Tag)
格式:
格式1:<标签名></标签名>
格式2:<标签名/>
元素是XML文档中最重要的组成部分。
由开始标签、标签体(元素体)、结束标签。其中标签体可以写其他标签(标签嵌套),也可以是文本内容。
空元素即标签体中没有任何内容,那么可以写成自闭合标签,例如: 。
元素命名:
- 区分大小写
- 不能使用空格冒号等特殊字符
- 不建议一XML、xml、Xml开头
- 格式良好的XML文件,有且仅有一个根标签(最外层的标签)
属性
<person id="110">
- 属性只能写在开始标签中
- 格式:属性名=“属性值”
- 一个元素可以有无数个属性,但是不能出现同名属性
- 属性名不能使用空格,冒号等特殊字符,且必须以字母开头
注释
<!-- 注释内容-->
<?xml version="1.0" encoding="UTF-8" ?>
<person id="001">
<!--快捷键是ctrl+shift+左斜杠-->
<!--一个人的信息-->
<age>18</age>
<name>李四</name>
<sex>男</sex>
</person>
转义字符
< ——<
>——>
"——"
'——&apos
&——&
字符区
当大量的转义字符出现在xml文档中时,会使XML文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。
<![CDATA[
文本数据
]]>
XML文件的约束
概念
XML约束就是我们编写XML文件时的标签的规则
DTD约束
DTD文档类型定义,规定我们在编写XML时具体的标签、子标签、属性等
案例实现
bookshelf.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "bookshelf.dtd"><!--指定使用bookshelf.dtd文件约束当前xml文档-->
<书架><书>
<书名>JavaWeb开发教程</书名>
<作者>张孝祥</作者>
<售价>100.00元</售价>
</书>
</书架>
schema约束
也是约束我们的XML文件的,其功能更强大,本身也是XML,后缀名是.xsd
代码实现
bookshelf.xsd
<?xml version="1.0" encoding="UTF-8" ?>
<!--DTD实例文档.将注释中的以下内容复制到要编写的xml的声明下面-->
<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>
book.xml
<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd">
<书>
<书名>三国</书名>
<作者>罗贯中</作者>
<售价>10.2</售价>
</书>
</书架>
其中schema中给我们的是标签的开始标签,我们需要自己补充完整的结束标签
XML解析
概述
就是通过代码,将XML文件中保存的的数据获取到。
解析方式和解析器和解析并发包
解析方式
-
DOM解析:将整个XML都加载到内存,进行解析,解析后生成一个Document对象。
优点:元素与元素之间保留了结构关系,可以直接对标签进行增删改查操作。
缺点:如果XML文件过大,会造成内训溢出。 -
SAX解析:扫描XML文档,扫描一行,解析一行,扫描完毕后释放一行。
优点:速度快,且可以解析大的文件
缺点:只能读,然后逐行释放资源 -
PULL解析:是Android系统内置的XML解析方式。
解析器
根据解析方式,提供具体的实现,写出对应的解析代码(代码需要考虑过程中的每个细节)。
解析开发包
对解析器繁琐API的封装,提供了简单方便的的API来操作XML文档。
常见的解析开发包
- Dom4j:比较简单的的解析开发包(常用)
- JAXP:sun公司提供支持DOM和SAX开发包
- JDom:与Dom4j类似
- Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便
Dom4j的基本使用
原理:是将整个XML文档整个加载到内存,生成一个document对象(倒立的DOM树)
引入dom4j的jar包
Dom4j常用方法
-
SAXReader对象
new SAXReader() //无参构造
Document read(String url) //读取XML文件,并生成Document -
Document对象
Element getRootElement() //获取文档中的根标签 -
Element对象
List elements([String ele] ) //获得指定名称的所有子元素。可以不指定名称
Element element([String ele]) // 获得指定名称第一个子元素。可以不指定名称
String getName() // 获得当前元素的元素名
String attributeValue(String attrName) // 获得指定属性名的属性值
String elementText(Sting ele) // 获得指定名称子元素的文本值
String getText() //获得当前元素的文本内容
案例实现
Dom4j的解析XML示例
public class demo {
public static void main(String[] args) throws DocumentException {
//创建核心对象
SAXReader saxReader = new SAXReader();
//读取XML配置文件
Document document = saxReader.read(new File("D:\\Develop\\WorkSpace\\ithema132\\day22\\Books.xml"));
//取出books根标签
Element rootElement = document.getRootElement();
//获取book标签,返回值是一个集合
List<Element> list = rootElement.elements();
//遍历该集合
for (Element element : list) {
//获取标签名
String name = element.getName();
//System.out.println(name);
//获取属性值
String string = element.attributeValue("id");
String string2 = element.attributeValue("出版社");
System.out.println("ID为:" + string);
System.out.println("出版社是:" + string2);
//继续获取子标签
List<Element> list1 = element.elements();
for (Element element1 : list1) {
//获取标签文本
String name2 = element1.getName();
System.out.print(name2 + "\t");
String name1 = element1.getText();
System.out.println(name1);
}
}
}
}
Dom4j结合XPath解析XML
XPath:称为XML的路径表达式,可以快速的从N层标签中选出我们需要的标签。
XPath使用步骤
- 导入jar包(dom4j和jaxen-1.1-beta-6.jar)
- 通过dom4j的SaxReader获取Document对象
- 利用Xpath提供的api,结合xpaht的语法完成选取XML文档元素节点进行解析操作
XPath相关的API介绍
List selectNodes(“表达式”) //获取所有的符合表达式的元素集合
Element selectSingleNode(“表达式”) //获取所有的符合表达式的唯一元素
XPath语法
- 绝对路径表达式
- 相对路径表达式
- 全文搜索路径表达式
格式:String xpath1="//子元素//子子元素";
2个“//”符号,不用逐级写路径,可以直接选取到对应的节点,是全文搜索匹配的不需要按照逐层级 - 谓语表达式