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、 标记嵌套

标记可以嵌套,但是不允许交叉

可以嵌套:


张三
18

1
2
3
4
不允许交叉(name和age):
张三
18

4、 属性

标记除了开始和结束 , 还有属性

标记中的属性,在标记开始时 描述,由属性名和属性值组成

格式:

在开始标记中, 描述属性

可以包含0-n个属性, 每一个属性是一个键值对

属性名不允许重复 ,键与值之间使用等号连接,多个属性之间使用空格分割(换行or空白字符都可以)
属性值必须被引号引住

代码示例:



李四
18


李四
20

### 5、 注释 注释不能写在文档声明前 注释间不能嵌套 格式: 注释开始: <!–
注释结束: —> ### 6、 根标记 标记与标记嵌套过程中最外层的部分叫做根,必须有且只能有一个根标记 names位于最外层,这段代码中有且仅有names一个根标记:
张三
李四

1
2
3
4
两个name都在最外层,无法区别哪个是根 李四
麻子 ### 7、 层级称呼 层级称呼:子标记(后代标记的一种)、父标记、兄弟标记、后代标记、祖先标记 子标记(后代标记的一种):上下相邻的被包含部分
父标记:上下相邻的外层部分
兄弟标记:同级
后代标记:被包含部分
祖先标记:外层部分
例如:
name是person的子标记,也是person的后代标记
person是name的父标记,也是name的祖先标记 name是persons的后代标记
persons是name的祖先标记 name与length护互为兄弟标记 对应代码如下:

李四
180cm


李四
170cm

解析

引入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 es = selectNodes(“路径表达式”);

  • 获取全部name:
    /books//book//name
    /books//name
    //name
  • 获取id=1001的name:
    //book[@id=‘1’]//name



解析实例

1.解析本地文件

image.png

通过XPATH

image.png

2.解析网络文件

image.png

通过Xpath

image.png

通过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();

实例

image.png

使用 XStream转换为XML字符串

步骤

首先加入jar包:xstream-1.3.1.jar

创建XStream对象
XStream x = new XStream();
修改类生成的节点名称 (默认节点名称为 包名.类名)
x.alias(“节点名称”,类名.class);
传入对象 , 生成XML字符串
String xml字符串 = x.toXML(对象);

实例

image.png

☆☆☆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(要转换的对象);

image.png

将JSON字符串转换为对象

步骤
  1. 引入JAR包
  2. 需要转换Java对象的位置编写如下代码:
    对象 = new Gson().fromJson(JSON字符串,对象类型.class);

image.png
有数组时
image.png

对象中的数组部分在转换过程中会转换成ArrayList

☆☆ FastJson

来自阿里

将对象转换为JSON字符串

步骤
  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
    String json=JSON.toJSONString(要转换的对象);

image.png

将JSON字符串转换为对象

步骤
引入JAR包
在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);

List<类型> list=JSON.parseArray(JSON字符串,类型.class);

image.png

image.png