XML
一、简介
含义
XML是可扩展标记语言(extensible Markup Language)
特性:
- xml具有平台无关性, 是一门独立的标记语言.
- xml具有自我描述性
用途
- 网络数据传输.
- 数据存储
- 配置文件
.XML文件
- .XML文件是保存XML数据的一种方式 ;
- XML数据也可以以其他的方式存在(如在内存中构建XML数据);
二、XML的使用
语法格式
1.XML文档声明
<?xml version="1.0" encoding="UTF-8"?>
2.标记(元素/标签/节点)
例:西游记
开始标记:<标记名称>
结束标记:</标记名称>
·标记名称需遵守以下命名规则:
- 名称可以为字母数字及其他字符
- 名称不能以数字或标点符号为开头
- 名称不能以"xml"(不区分大小写)为开始
- 名称不能包含空格,不能包含冒号
- 名称区分大小写
·开始标记和结束标记之间为标记内容
3.一个XML文档中必须且只能有一个根标记
4.标记可以嵌套,但不能交叉
5. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)
<?xml version="1.0" encoding="UTF-8"?>
<a001>
<a002>
<a003>哈哈</a003>
<a004>呵呵</a004>
</a002>
</a001>
相差一代:
a003是a002的子标记,也是后代标记
a002是a003的父标记
相差两代:
a001是a003的祖先标记
a003是a001的后代标记
同代:
a003是a004的兄弟标记
6.标记名称,允许重复
7.标记属性
格式:
1.在开始标记中, 描述属性.
2.可以包含0-n个属性, 每一个属性是一个键值对!
3.属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
4.属性值 必须被引号引住.
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001" group="玄幻">
<name>小明修仙记</name>
<info>小明称霸小学界的艰苦历程</info>
</book>
<book id="1002" group="言情">
<name>花落知多少</name>
<info>你猜呀,猜对也不告诉你</info>
</book>
</books>
8.注释
开始:<!--
结束:-->
9.CDATA
CDATA 部分中的所有内容都会被解析器忽略。
开始:<![CDATA[
结束: ]]>
三.Java解析XML 掌握
1.四种解析方式
(1)SAX解析
逐行读取XML文件,解析时触发时间
优点:
1.可立即分析,不用加载XML中的所有数据
2.逐行加载,结束释放,节省内存
3.条件满足可停止,不必全部解析
缺点:
1.无法同时访问文档不同部分(访问过即释放)
2.无法得知元素层次,只能维护当前的父/子关系
3.只读,无法修改
(2)DOM解析
分析需要加载整个文档,建立文档树模型,程序员可通过操作文档数,完成数据的删、改、查;
优点:
1.文档加载至内存,可以修改;
2.访问时双向的,可以在任何时候在树中双向解析数据
缺点:
文档全部加载在内存中,耗费资源较大
(3)JDOM解析
第一个JAVA特定模型,比DOM实现更快
(4)DOM4J解析
JDOM的一种智能分支,包括集成的XPath支持、XML、Schema支持及用于大文档或流化文档的基于事件的处理;
2.DOM4J解析XML
(1)步骤
1.引入jar文件dom4j,jar
2.创建一个指向XML的文件输入流
3.创建一个XML的读取工具对象
4.使用读取工具读取XML文档的输入流,得到文档对象
5.用文档对象获取文档根元素
(2)文档对象 Document常用方法
- 通过文档对象, 获取XML文档中的根元素对象
Element root = doc.getRootElement();- 添加根节点
Element root = doc.addElement(“根节点名称”);
(3)元素对象Element常用方法
- 获取节点名称
String getName();- 获取节点内容
String getText();- 设置节点内容
String setText();- 根据子节点的名称 , 获取匹配名称的第一个子节点对象
Element element(String 子节点名称);- 获取所有的子节点对象
List elements();
6.获取节点的属性值
String attributeValue(String 属性名称);- 获取子节点的内容
StringelementText(String 子节点名称);- 添加子节点
Element addElement(String 子节点名称);- 添加属性
void addAttribute(String 属性名,String 属性值);
(4)本地文件解析案例
public class Books {
public static void main(String[] args) throws IOException, DocumentException {
//第一步,引入jar包
//第二步,创建XML文件的输入流
FileInputStream fis = new FileInputStream("D:\\books.xml");
//第三步,创建XML读取工具
SAXReader sr = new SAXReader();
//第四步,用读取工具将XML的输入流读取为文档对象
Document doc = sr.read(fis);
//第五步,通过文档对象获取根元素(根标签)
Element root = doc.getRootElement();
//元素方法一:获取元素名
System.out.println(root.getName());
//元素方法二:获取指定名称元素,及元素内容
Element book = root.element("book");
Element name =book.element("name");
System.out.println(book.getText());
System.out.println(name.getText());
//元素方法三:获取元素属性
System.out.println(book.attributeValue("id"));
//元素方法四:获取子标签内容
System.out.println(book.elementText("info"));
fis.close();
}
}
(5)网络文件解析案例
public class Demo {
public static void main(String[] args) throws IOException, DocumentException {
// 1 获取XML输入流(链接要加双引号)
URL url = new URL("http://apis.juhe.cn/mobile/get?phone=18726367343&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
// 1.1 打开网址
URLConnection ucn = url.openConnection();
// 1.2将网址连接转换为流
InputStream is = ucn.getInputStream();
// 2 创建读取工具
SAXReader sr = new SAXReader();
// 3 读取网络XML为文件
Document doc = sr.read(is);
// 4.获取根元素
Element root = doc.getRootElement();
}
}
3.XPATH解析
路径表达式:
- / : 从根节点开始查找
- // : 从发起查找的节点位置 查找后代节点 ***
- . : 查找当前节点
- … : 查找父节点
- @ : 选择属性. * 属性使用方式: [@属性名=‘值’] [@属性名>‘值’] [@属性名<‘值’] [@属性名!=‘值’]
public class Demo1 {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
//第二步,创建XML文件的输入流
FileInputStream fis = new FileInputStream("D://books.xml");
//第三步,创建XML读取工具
SAXReader sr = new SAXReader();
//第四步,用读取工具将XML的输入流读取为文档对象
Document doc = sr.read(fis);
// 查找后代节点
List<Node> names = doc.selectNodes("//name");
for(int i=0;i<names.size();i++){
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
}
}
4.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();
四、JSON
1.JSON介绍
JSON: { “name”:“金苹果”, “info”:“种苹果” }
一个对象, 由一个大括号表示. 括号中 描述对象的属性 .
格式:
键与值之间使用冒号连接,多个键值对之间使用逗号分隔.
键值对的键 应使用引号引住
键值对的值,可以是JS中的任意类型的数据
2.json解析
Gson
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
public class Demo2 {
public static void main(String[] args) {
// 1 创建Gson对象
Gson g = new Gson();
// 2 创建对象
Book book = new Book("1001","西游记","取经的故事和事故");
// 3 转换为字符串
String s = g.toJson(book);
System.out.println(s);
// 转回对象,指定json内容和要转换的类型
Book book2 = g.fromJson("{\"id\":\"1001\",\"name\":\"西游记\",\"info\":\"取经的故事和事故\"}",Book.class);
System.out.println(book2.toString());
}
}
打印:
{"id":"1001","name":"西游记","info":"取经的故事和事故"}
book{id='1001', name='西游记', info='取经的故事和事故'}
FastJson
转换JSON字符串的步骤:
- 引入JAR包
- 在需要转换JSON字符串的位置编写如下代码即可:
String json=JSON.toJSONString(要转换的对象);
在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
public class Demo3 {
public static void main(String[] args) {
Book book = new Book("1002","很纯很暧昧","比想象的要正经");
// 转换为json字符串
String s = JSON.toJSONString(book);
System.out.println(s);
// 用json字符串转换回对象
Book book2 = JSON.parseObject("{\"id\":\"1002\",\"info\":\"比想象的要正经\",\"name\":\"很纯很暧昧\"}",Book.class);
System.out.println(book2.toString());
}
}
打印:
{"id":"1002","info":"比想象的要正经","name":"很纯很暧昧"}
book{id='1002', name='很纯很暧昧', info='比想象的要正经'}