XML与JSON笔记整理
程序员文章站
2022-03-30 13:13:35
...
XML简介
可扩展标记语言(
eXtensible Markup Language
)。
特性
:
1. xml
具有平台无关性
,
是一门独立的标记语言
.
2. xml
具有自我描述性
XML语法
1. XML
文档声明
<?xml version="1.0" encoding="UTF-8"?>
2.
标记
(
元素
/
标签
/
节点
)
XML
文档
,
由一个个的标记组成
.
语法
:
开始标记
(
开放标记
): <
标记名称
>
结束标记
(
闭合标记
): </
标记名称
>
标记名称
:
自定义名称,必须遵循以下命名规则:
1.
名称可以含字母、数字以及其他的字符
2.
名称不能以数字或者标点符号开始
3.
名称不能以字符
“xml”
(或者
XML
、
Xml
)开始
4.
名称不能包含空格,不能包含冒号(
:
)
5.
名称区分大小写
标记内容
:
开始标记与结束标记之间
,
是标记的内容
.
3.
一个
XML
文档中
,
必须有且且仅允许有一个根标记
.
4.
标记可以嵌套
,
但是不允许交叉
.
5.
标记的层级称呼
(
子标记
,
父标记
,
兄弟标记
,
后代标记
,
祖先标记
)
6.
标记名称 允许重复
7.
标记除了开始和结束
,
还有属性
.
标记中的属性
,
在标记开始时 描述
,
由属性名和属性值 组成
.
格式
:
在开始标记中
,
描述属性
.
可以包含
0-n
个属性
,
每一个属性是一个键值对
!
属性名不允许重复
,
键与值之间使用等号连接
,
多个属性之间使用空格分割
.
属性值 必须被引号引住
.
8.
注释
注释不能写在文档文档声明前
注释不能嵌套注释
格式
:
注释开始
: <!--
注释结束
: -->
案例
描述一组图书
books,
至少包含
3
本书
图书
book
包含
图书名称
name
图书简介
info ,
以及属性
id
<?xml version="1.0" encoding="UTF-8"?>
<books>
</books>
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id = "1001">
<name>金苹果</name>
<info>种苹果</info>
</book>
<book id = "1002">
<name>银苹果</name>
<info>种苹果</info>
</book>
</books>
XML解析
public class Demo2 {
public static void main(String[] args) throws IOException, DocumentException {
FileInputStream fis = new FileInputStream("d:Demo.xml");
SAXReader sr = new SAXReader();
Document doc = sr.read(fis);
List<Node> names = doc.selectNodes("//book[@id='1001']//name");
for(int i=0;i<names.size();i++){
System.out.println(names.get(i).getName());
System.out.println(names.get(i).getText());
}
fis.close();
}
}
结果
name
金苹果
XML生成
public class Demo3 {
public static void main(String[] args) throws IOException {
Document doc = DocumentHelper.createDocument();
Element books = doc.addElement("books");
for(int i=0;i<100;i++){
Element book = books.addElement("book");
Element name = book.addElement("name");
name.setText(i+"种苹果");
Element info = book.addElement("info");
info.addText(i+"种苹果的故事");
book.addAttribute("id",100+i+"");
}
FileOutputStream fos = new FileOutputStream("d://books.xml");
XMLWriter xw = new XMLWriter(fos);
xw.write(doc);
xw.close();
System.out.println("执行完毕");
}
}
结果
执行完毕
然后得到一个books.xml文件
面试题
问
: Java
中有几种
XML
解析方式
?
分别是什么
?
有什么样的优缺点
?
答
:
四种
.
1. SAX
解析
解析方式是事件驱动机制
!
SAX
解析器
,
逐行读取
XML
文件解析
,
每当解析到一个标签的开始
/
结束
/
内容
/
属性时
,
触
发事件
.
我们可以编写程序在这些事件发生时
,
进行相应的处理
.
优点
:
分析能够立即开始,而不是等待所有的数据被处理
逐行加载
,
节省内存
.
有助于解析大于系统内存的文档
有时不必解析整个文档
,
它可以在某个条件得到满足时停止解析
.
缺点
:
1.
单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据
(
因为逐
行解析
,
当解析第
n
行是
,
第
n-1
行已经被释放了
,
无法在进行操作了
).
2.
无法得知事件发生时元素的层次
,
只能自己维护节点的父
/
子关系
.
3.
只读解析方式
,
无法修改
XML
文档的内容
.
2. DOM
解析
是用与平台和语言无关的方式表示
XML
文档的官方
W3C
标准,分析该结构通常需要加载整个
文档和内存中建立文档树模型
.
程序员可以通过操作文档树
,
来完成数据的获取 修改 删除等
.
优点
:
文档在内存中加载
,
允许对数据和结构做出更改
.
访问是双向的,可以在任何时候在树中双向解析数据。
缺点
:
文档全部加载在内存中
,
消耗资源大
.
3. JDOM
解析
目的是成为
Java
特定文档模型,它简化与
XML
的交互并且比使用
DOM
实现更快。由于是第一
个
Java
特定模型,
JDOM
一直得到大力推广和促进。
JDOM
文档声明其目的是
“
使用
20%
(或更少)的精力解决
80%
(或更多)
Java/XML
问题
”
(根据学习曲线假定为
20%
)
优点
:
使用具体类而不是接口,简化了
DOM
的
API
。
大量使用了
Java
集合类,方便了
Java
开发人员。
缺点:
没有较好的灵活性。
性能不是那么优异。
4. DOM4J
解析
它是
JDOM
的一种智能分支。它合并了许多超出基本
XML
文档表示的功能,包括集成的
XPath
支持、
XML Schema
支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,
DOM4J
是一个非常优秀的
Java XML API
,具有性能优异、功能强大和极端易用使用的特点,同时它也是一
个开放源代码的软件。如今你可以看到越来越多的
Java
软件都在使用
DOM4J
来读写
XML
。
目前许多开源项目中大量采用
DOM4J ,
例如
:Hibernate
JSON
JSON: JavaScript Object Notation JS
对象简谱
,
是一种轻量级的数据交换格式
.
格式
一本书
书名
简介
java
class Book{
private String name;
private String info;
数组格式
案例
get/set...
}
Book b = new Book();
b.setName(“
金苹果
”);
b.setInfo(“
种苹果
”);
...
js:
var b = new Object();
b.name = "
金苹果
";
b.info = "
种苹果
";
XML:
<book>
<name>
金苹果
</name>
<info>
种苹果
</info>
</book>
JSON:
{
"name":"
金苹果
",
"info":"
种苹果
"
}
一个对象
,
由一个大括号表示
.
括号中 描述对象的属性
.
通过键值对来描述对象的属性
(
可以理解为
,
大括号中
,
包含的是一个个的键值对
.)
格式
:
键与值之间使用冒号连接
,
多个键值对之间使用逗号分隔
.
键值对的键 应使用引号引住
(
通常
Java
解析时
,
键不使用引号会报错
.
而
JS
能正确解
析
.)
键值对的值
,
可以是
JS
中的任意类型的数据
JSON解析
public class Book {
private String id;
private String name;
private String info;
public Book(String id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(id, book.id) && Objects.equals(name, book.name) && Objects.equals(info, book.info);
}
@Override
public int hashCode() {
return Objects.hash(id, name, info);
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
public class Demo5 {
public static void main(String[] args) {
Gson g = new Gson();
Book b = new Book("100","金苹果","种苹果");
String s = g.toJson(b);
System.out.println(s);
}
}
结果
{"id":"100","name":"金苹果","info":"种苹果"}
public class Demo6 {
public static void main(String[] args) {
Gson g = new Gson();
//{"id":"100","name":"金苹果","info":"种苹果"}
Book b = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种苹果\"}",Book.class);
System.out.println(b.getId());
}
}
结果
100
上一篇: 全都被风刮跑了