XML与JSON
XML和JSON是目前最常用的两种数据交换格式。数据交换格式,就是服务器端与客户端之间进行数据传输与交换的格式。
1. XML语法
XML(extensiable Markup Language)是可扩展标记语言,它独立于任何平台、独立于任何编程语言;因此能够跨平台交换数据,使用不同编程语言编写的代码也都能解析XML格式的数据。
(1)XML文档声明
在.xml文件的开头,指明版本和编码方式
<?xml version="1.0" encoding="utf-8"?>
(2)标签
标签,也称为元素、节点; XML文档是由一个个标签组成的; 标签的开始用<>,结尾用</>
<标签名>内容 </标签名>
<name>金苹果</name>
每个标签都有一个标签名,可以重名;
标签的命名规则:使用字母、数字和字符,不能以数字和标点符号开头,区分大小写
(3)有且仅有一个根标签
标签内部可以嵌套多个标签,但xml文件中的所有标签要全部嵌套在一对标签内,也就是根标签
<books>
<book>
<name>金苹果</name>
<info>种苹果的方法</info>
</book>
</books>
name是book的子标签,book是books的子标签
books是book的父标签,是name的祖先标签
(4)标签的属性
标签除了有开头、结尾,还有属性
在标签的开始位置定义并指定属性值
<标签名 属性="属性值">内容</标签名>
<name id="1001" version="1.2">金苹果</name>
可以有多个属性,用空格间隔
(5)注释
xml文件的注释:
<!-- 注释内容 -->
例子:
<?xml version="1.0" encoding="UTF-8"?>
<!--
注释:<?xml ?>是文件的声明,一定要放在文件的最最最开头,?是前后的标志,xml表示该文件是一个xml文件
--><books>
<book id="1000">
<name>金苹果</name>
<price>18</price>
</book>
<!--
第一本书,标记名称是book,属性是id 属性值为1000,book的内部还包含了两个标记
分别是书名name和价格price
-->
<book id="1001">
<name>银苹果</name>
<price>17</price>
</book>
<book id="1002">
<name>铜苹果</name>
<price>16</price>
</book>
</books>
2. XML解析
Java中XML解析方法有四种,分别是SAX解析、DOM解析、JDOM解析、DOM4J解析;
(1)SAX解析是逐行解析,每次读取xml文件的一行,解析完之后释放改行资源再读下一行,
使用的是事件驱动机制,每读取到一个标签的开头、结尾、属性时触发事件;
优点:节省内存、不必解析整个文档(满足某个条件时可以提前终止解析)
缺点:只能读取文件,不能修改、添加、删除;无法得知层次关系;无法定位文档层次
(2)DOM解析首先将整个文档加载到内存,并建立文档树,可以通过操作文档树,对数据进行添加、修改和删除
优点:允许对数据和结构进行修改;
缺点:内存消耗大
(3)JDOM是第一个JAVA特定模型,简化了DOM的API,方便java开发人员
(4)DOM4J是JDOM的分支,集成了XPath等,功能更强,效率更高。以下内容都是基于DOM4J的XML解析
(1) Document
Document文档对象,对应的是整个xml文件,主要操作:
Element root = doc.getRootElement()获取根节点
Element root = doc.addElement(String) 添加根节点
(2) Element
Element 节点对象(元素),对应的是xml文件中的一个标签,主要操作:
String str =element.getName() 获取标签名
String str = element.getText() 获取标签内容
List<Element> list = element.elements()获取全部子节点
Element e = element.element(String str) 获取第一个名称为str的子节点
String str = element.attributeValue(String 属性名) 获取对应的属性值
String str = element.elementText(String 子节点名称) 获取对应子节点的内容
element.setText("内容")指定标签的内容为……
element.addElement("标签名"); 添加子节点,指定名字
element.addAttribute("属性名","属性值") 添加属性,直接设置属性值
(3) SAXReader
SAXReader类用于读取XML文件(Stream API for XML Reader) 将xml文档按照字节流的形式读取
SAXReder reader = new SAXReader();
Document doc = reader.read(new FileInputStream("demo.xml")); //指向xml文件的输入流fis,SAXReader从流中读取,并返回一个Document对象
Element root = doc.getRootElement();
(4) XPath
XPath类似于linux系统中的文件路径 ,用来更加方便的寻找标签
/根标签 //普通标签 .当前 ..上一级 @属性
List<Element> list = doc.selectNodes("//name")找到当前节点下面的所有name节点
Element e = doc.selectSingleNode("//book[@id='1001']//name")找到一个唯一的节点,该节点位于属性值为1001的book节点下,节点的名称为name
3. JSON语法
一个大括号代表一个对象,内部是一个个“键值对”(属性和属性值,都用双引号引起来,键值之间用冒号连接),用逗号间隔,对象里面可以嵌套对象,键值对的值可以是一个字符串,也可以是数组[“”,“”,“”],还可以是对象,还可以是对象数组
{
"name":"金苹果",
"info":"种植苹果的方法",
"page":["page1","page2","page3"]
}
4. JSON解析
将Java中的对象 快速的转换为 JSON格式的字符串.
将JSON格式的字符串, 转换为Java的对象.
(1)Gson
导入jar包,创建Gson对象
Gson gson = new Gson();
gson.toJson(Object) 从对象转换成JSON字符串
gson.fromJson(String,Class) 从JSON字符串还原对象
如果类存在,可以传入xx.class,返回对应类型的对象;如果类不存在,可以传入HashMap.class将返回一个map
(2)FastJson
导入jar包,调用JSON类的静态方法
JSON.toJsonString(Object) 从对象到字符串
JSON.parseObject(String,Class) 从字符串还原为对象
JSON.parseArray(String,Class) 从字符串还原为数组
不管Gson还是FastJson都会自动把数组转成List