XML可拓展标记语言
XML:可扩展标记语言(eXtensible Markup Language)
通常指字符串,而不是文件
.XML文件
.XML文件是保存XML数据的一种方式
XML数据也可以以其他的方式存在(如在内存中构建XML数据)
不要将XML语言狭隘的理解成XML文件
特性
具有平台无关性,是一门独立的标记语言(不依赖,单独存在也是有意义的)
系统平台无关性:XML文件不论是在windows系统还是苹果系统打开,都是一样的
语言平台无关性:不论由java还是python还是其他语言进行解析,看到的效果特性都是一样的,因此可以跨语言
具有自我描述性(自己描述自己)
作用
网络数据传输(一般用JSON)
(有层次、很清晰地区分一段数据里的内容)
数据存储(基本不用)
(重要数据实现互通,方便程序读取)
配置文件(用的最多)
语法
1、 文档声明
必须放在第一行
<?xml version=”1.0” encoding=”UTF-8”?>
版本:1.0
编码:UTF-8
2、 描述内容(关键部分)
XML : 可扩展标记语言(eXtensible Markup Language)
描述的内容,即标记 ( 元素 / 标签 / 节点) ,标记之间允许重名
元素:描述包含关系
标签:语法
节点:加载的时候通常以节点方式展开
XML文档,由一个个的标记组成
开始标记(开放标记): <标记名称>
结束标记(闭合标记): </标记名称>
标记名称:(自定义名称,必须遵循以下命名规则)
1.可以含字母、数字以及其他的字符
2.不能以数字或者标点符号开始
3.不能以字符 “xml”(或者 XML、Xml)开始
4.不能包含空格,不能包含冒号(:)
5.区分大小写
标记内容:
开始标记与结束标记之间
例如,通过标记,描述一个name:
3、 标记嵌套
标记可以嵌套,但是不允许交叉
可以嵌套:
1
2
3
4
不允许交叉(name和age):
18
4、 属性
标记除了开始和结束 , 还有属性
标记中的属性,在标记开始时 描述,由属性名和属性值组成
格式:
在开始标记中, 描述属性
可以包含0-n个属性, 每一个属性是一个键值对
属性名不允许重复 ,键与值之间使用等号连接,多个属性之间使用空格分割(换行or空白字符都可以)
属性值必须被引号引住
代码示例:
注释结束: —> ### 6、 根标记 标记与标记嵌套过程中最外层的部分叫做根,必须有且只能有一个根标记 names位于最外层,这段代码中有且仅有names一个根标记:
1
2
3
4
两个name都在最外层,无法区别哪个是根
父标记:上下相邻的外层部分
兄弟标记:同级
后代标记:被包含部分
祖先标记:外层部分
例如:
name是person的子标记,也是person的后代标记
person是name的父标记,也是name的祖先标记 name是persons的后代标记
persons是name的祖先标记 name与length护互为兄弟标记 对应代码如下:
解析
引入jar文件
dom4j.jar
创建一个指向XML文件的输入流
FileInputStream fis = new FileInputStream(“xml文件的地址”);
创建一个XML读取工具对象
SAXReader sr = new SAXReader();
使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
Document doc = sr.read(fis);
通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();
Java中的解析方式
细分为四种:SAX解析、DOM解析、JDOM解析、DOM4J解析
通常情况下为两种:SAX解析、DOM解析(JDOM解析是DOM基于Java的解析,DOM4J解析是在JDOM解析基础上的提升)
1、 SAX解析(少用)
解析方式是事件驱动机制 (逐行读取,到达关键节点时会有相应驱动产生)
SAX解析器,逐行读取XML文件解析,每当解析到一个标签的开始/结束/内容/属性时,触发事件
优点:
1.分析能够立即开始,而不是等待所有的数据被处理
2.逐行加载,节省内存,有助于解析大于系统内存的文档
3.有时不必解析整个文档,可在某个条件得到满足时停止解析
缺点:
1.单向解析(只能前进无法后退),无法同时访问同一文档的不同部分数据(逐行解析, 当解析第n行时第n-1行已经被释放, 无法再进行操作)
2.无法定位文档层次,无法得知事件发生时元素的层次,只能自己维护节点的父/子关系
3.只能读取,无法修改XML文档的内容
2、 DOM解析(常用)
用与平台和语言无关的方式 表示XML文档的官方W3C标准
一次性读取,再去解析:分析该结构通常需要加载整个文档、内存中建立文档树模型,程序员通过操作文档树来完成数据的获取、修改、删除等
优点:
1.文档在内存中加载,允许对数据和结构做出更改
2.访问双向,可在任何时候在树中双向解析数据
缺点:
文档全部加载在内存中,消耗资源大
3、 JDOM解析(DOM基于Java的解析)
JDOM解析是DOM解析基于Java的解析
是Java特定文档模型,简化了与XML的交互并且比使用DOM实现更快
由于是第一个Java特定模型,JDOM一直得到大力推广和促进
JDOM文档声明目的是 “使用20%(或更少)的精力解决80%(或更多)Java/XML问题”
(根据学习曲线假定为20%)
优点:
1.使用具体类而不是接口,简化了DOM的API
2.大量使用Java集合类,方便了Java开发人员
缺点:
1.没有较好的灵活性
2.性能不优异
4、 ⭐DOM4J解析(JDOM的智能分支)
许多Java软件都在使用DOM4J读写XML
是JDOM的一种智能分支,是在JDOM解析基础上的提升
合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理,提供了构建文档表示的选项
DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时也是一个开放源代码的软件
目前许多开源项目中大量采用DOM4J , 例如:Hibernate
使用步骤
通过Node类的两个方法, 来完成查找:
(Node是 Document 与 Element 的父接口)
方法1
//根据路径表达式, 查找匹配的单个节点
Element e = selectSingleNode(“路径表达式”);
方法2
List
- 获取全部name:
/books//book//name
/books//name
//name - 获取id=1001的name:
//book[@id=‘1’]//name
解析实例
1.解析本地文件
通过XPATH
2.解析网络文件
通过Xpath
通过Java生成XML文件
步骤
通过文档帮助器 (DocumentHelper) , 创建空的文档对象
Document doc = DocumentHelper.createDocument();
通过文档对象, 向其中添加根节点
Element root = doc.addElement(“根节点名称”);
通过根节点对象root , 丰富子节点
Element e = root.addElement(“元素名称”);
创建一个文件输出流,用于存储XML文件
FileOutputStream fos = new FileOutputStream(“要存储的位置”);
将文件输出流,转换为XML文档输出流
XMLWriter xw = new XMLWriter(fos);
写出文档
xw.write(doc);
释放资源
xw.close();
实例
使用 XStream转换为XML字符串
步骤
首先加入jar包:xstream-1.3.1.jar
创建XStream对象
XStream x = new XStream();
修改类生成的节点名称 (默认节点名称为 包名.类名)
x.alias(“节点名称”,类名.class);
传入对象 , 生成XML字符串
String xml字符串 = x.toXML(对象);
实例
☆☆☆JSON解析(常用)
JSON: JavaScript Object Notation
JSON是JS对象简谱,是一种轻量级的数据交换格式
欧洲计算机协会制定的JS规范的子集,完全独立于编程语言,用文本来表示数据
JSON对象格式
JS中name和info的引号可以省略,可以是单的也可以是双的,与Java程序员交互时name和info加引号
{
“name”:”Java核心技术”,
“info”:”讲述了Java核心技术的有关内容”
}
一对大括号表示一个对象,大括号中包含了一个个键值对
通过键值对来描述对象的属性,属性名与属性值之间用冒号隔开: 属性名:属性值
键值对的键应使用引号引住 (JS能正确解析,但是通常Java解析时,键不使用引号会报错)
键值对的值可以是JS中的任意类型的数据
多个属性之间用逗号隔开
在JSON格式中可以与对象互相嵌套:[元素1,元素2…]
Java与JSON
将Java中的对象快速的转换为JSON格式的字符串
将JSON格式的字符串,转换为Java的对象
Gson
来自谷歌
将对象转换为JSON字符串
步骤
引入JAR包
在需要转换JSON字符串的位置编写如下代码:
String json = new Gson().toJSON(要转换的对象);
将JSON字符串转换为对象
步骤
- 引入JAR包
- 在需要转换Java对象的位置编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
有数组时
对象中的数组部分在转换过程中会转换成ArrayList
☆☆ FastJson
将对象转换为JSON字符串
步骤
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json=JSON.toJSONString(要转换的对象);
将JSON字符串转换为对象
步骤
引入JAR包
在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);