文章目录
- xml
- xml语法格式
- (面试题) java如何生成XML ?
- Java中有几种解析方式 ?
- DOM4J解析XML基本用法
- 文档对象 Document (基操)
- 元素对象 Element
- XStream的基本使用方法
- JSON
- Gson(谷歌) 和FastJson (阿里)
xml
定义 =>
可扩展标记性语言 => 软件与软件交流时所使用的语言 => eg: C程序和Java程序进行交流
历史 =>
用Java的对象也是可以传输数据的
但是他有什么不好的地方呢 ?
不能跨语言, 比如说: C语言的工程师就不能拿Java的对象数据直接使用
xml可以 => 平台无关性
作用 =>
- 网络数据传输 => json
- 数据存储 => 基本不用
- 配置文件 => 跨平台, 任何语言工作的开发者都能够对其进行读取
使用 =>
看语法去吧~
xml语法格式
1. 文档声明
<?xml version="1.0" encoding="utf-8">
2. 标记 (直接看使用啦~ 不整那些复杂的定义呐~)
<name>阿乐</name>
3. 必须有且仅许有一个根标记
<names> //这就是根标记, 且只能出现一次, 不能重复(子标记可以)
<name>大乐</name>
<name>小乐</name>
</names>
4. 标记的层级称呼 (子标记, 父标记, 兄弟标记, 后代标记, 祖先标记)
就是上一代下一代的标记
<persons>
<person>
<name>阿乐</name>
<length>18cm</length>
</person>
</persons>
name是person的子标记, 也是person的后代标记
name是persons的后代标记
name是length的兄弟标记
5. 标记允许重复, 根标记不允许
6. 属性(id)
<name id="1001">
<age>18</age>
</name>
7. 注释
<!-- -->
8. 语法进阶了解 ( CDATA )
"<" 和 "&" => XML元素中非法的元素
(面试题) java如何生成XML ?
Java中有几种解析方式 ?
- SAX解析 => 一行行的解析, 立即开始, 可以解析大于内存的文档, 而且读到想要的时候就能停止
缺点:
单向解析, 无法定位文档层次, 且逐行解析, 解析的前一行会被释放;
无法得知层次关系;
只能解析不能修改; - DOM解析
=> 整个文章生背下来 => 建立出一个文档树模型, 可以对数据做出更改, 访问是双向的
缺点:
消耗资源大, 但是可以忽略不记 - JDOM解析 => 使用的是类而不是接口, 大量使用集合类 => 灵活性不高 => 性能不是很优异
- DOM4J解析 => 面向接口了, 非常非常的方便 (对于Java来说)
DOM4J解析XML基本用法
- 引入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();
文档对象 Document (基操)
Document => 加载到内存的整个XML文档
1. 获取根元素对象
Element root = doc.getRootElement();
2. 添加根节点
Element root = doc.addElement("Person")
元素对象 Element
1. 获取节点名称
String getName();
2. 获取节点内容
String getText();
3. 设置节点内容
String setText();
4. 根据子节点的名称, 获取匹配名称的第一个子节点对象.
Element element(String 子节点名称);
5. 获取所有的子节点对象
List<Element> elements();
6. 获取节点的属性值
String attributeValue(String 属性名称);
7. 获取子节点的内容
String elementText(String 子节点名称);
8. 添加子节点
Element addElement(String 子节点名称);
9. 添加属性
void addAttribute(String 属性名, String 属性值)
//1. 获取文件输入流
FileInputStream fis = new FileInputStream("...");
//2. 创建XML读取工具
SAXReader sr = new SAXReader();
//3. 读取工具, 读取XML文档输入流, 得到对象
Document doc = sr.read(fis);
//4. 文档对象获取根节点
Element root = doc.getRootElement();
//5. 根节点, 获取所有子节点, 存到List当中
List<Element> es = root.elements();
for(Element e : es){
// 获取属性值使用attributeValue方法
String id = e.attributeValue("id");
//获取节点用element(), 获取内容用getText()
String name = e.element("name").getText();
}
XStream的基本使用方法
作用 =>
快速将Java中的对象转换为XML字符串
使用 =>
1. 创建 XStream 对象
XStream x = new XStream();
2. 修改类生成的节点名称 (因为默认为 包名.类名 会很长很复杂)
x.alias("节点名称", 类名.class);
3. 将对象转化为xml字符串 (调用toXML)
String xml = x.toXML(b);
示例代码:
public static void main(String[] args) {
Book b =new Book("阿乐的故事", "讲述了阿乐成长的一生");
//XStream => 将Java对象转化为xml字符串
//1. 创建XStream
XStream x = new XStream();
//2. 修改xstream的节点名称, 你可以不更改看看它默认情况生成的是什么样子
x.alias("book", Book.class);
//3. 将对象转化为xml字符串 (调用toXML)
String xml = x.toXML(b);
System.out.println(xml);
}
static class Book{
private String name;
private String info;
public Book(String name, String info) {
this.name = name;
this.info = info;
}
}
运行结果 =>
<book>
<name>阿乐的故事</name>
<info>讲述了阿乐成长的一生</info>
</book>
JSON
定义 =>
轻量级数据交换格式 (程序和程序, 客户端和程序…)
历史 =>
json将xml击败成为主流数据存储格式
解析速度更快, 更简洁, 占用内存更小, 网络传输速度更快
基本格式=>
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin" },
{ "firstName": "Jason", "lastName":"Hunter" },
{ "firstName": "Elliotte", "lastName":"Harold" }
]}
Gson(谷歌) 和FastJson (阿里)
能够将Java对象和Json字符串相互转化的包
Gson =>
1. 对象 => Json
Book b = BookDao.find();
//new Gson().toJson();
String json = new Gson().toJson(b);
System.out.println(json)
2. Json => 对象
String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰 \",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
//new Gson().fromJson();
Book book = new Gson().fromJson(json, Book.class);
System.out.println(book);
FastJson =>
1. 对象 => Json
Book b = BookDao.find();
//JSON.toJSONString()
String json=JSON.toJSONString(b);
System.out.println(json);
2. Json => 对象
String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰 \",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
//JSON.parseObject()
Book book = JSON.parseObject(json, Book.class);
System.out.println(book);