目录
一、Java中有4种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
DOM4J-XPATH解析XML
路径表达式
:
1. / :
从根节点开始查找
2. // :
从发起查找的节点位置 查找后代节点
***
3. . :
查找当前节点
4. .. :
查找父节点
5. @ :
选择属性
. *
属性使用方式
:
[@属性名
='
值
']
[@
属性名
>'
值
']
[@
属性名
<'
值
']
[@
属性名
!='
值
']
例如books:
路径:
//book[@id='1001']//name
二、xml与json的demo
1. demo.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001">
<name>金苹果</name>
<info>锄禾日当午,苹果很辛苦</info>
</book>
<book id="1002">
<name>银苹果</name>
<info>锄禾日当午,苹果很辛苦</info>
</book>
<fei id="100">
<name>111</name>
<info>锄禾日当午,苹果很辛苦</info>
</fei>>
</books>
2. dome.json
{
"name": "已成为",
"age": 18,
"pengyou": [
"张三",
"李四",
"王二",
"麻子",
{
"name": "野马",
"info": "像匹野马一样狂奔在技术钻研的道路上"
}
],
"heihei": {
"name": "大长刀",
"length": "40m"
}
}
三、JAVA对象与XML/JSON互转代码
1. Java对象转化成xml
private static void creatXMLByObject() {
Person p = new Person();
p.setName("张三");
p.setAge(26);
XStream xStream = new XStream();
xStream.alias("person", Person.class);
String xml = xStream.toXML(p);
System.out.println(xml);
}
2. xml转换成Java对象
private static void creatXML() throws IOException {
//通过DocumentHelper,创建空的文档
Document doc = DocumentHelper.createDocument();
//添加的第一个元素就是根节点
Element root = doc.addElement("books");
//通过根节点丰富子节点
for (int i = 0; i < 50; i++) {
Element e = root.addElement("book");
e.addAttribute("id",1+i+"");
Element name = e.addElement("name");
Element info = e.addElement("info");
name.setText("苹果" + (i+1));
info.setText("种了第" + (i+1) + "个苹果");
}
//创建文件流对象
FileOutputStream fos = new FileOutputStream("E:\\InterllJ2020\\workspace\\kaikeba\\data\\creatDemo.xml");
//将文件流对象传给XML,转成xml对象
XMLWriter xw = new XMLWriter(fos);
xw.write(doc);
xw.close();
}
3.谷歌的json转Java对象
private static void gJsonToObject() {
//创建gson对象
Gson gson = new Gson();
//创建json字符串
String s = "{\"id\":1001,\"name\":\"金色气球\",\"info\":\"气球真好看\"}";
//转换
Book book = gson.fromJson(s, Book.class);
System.out.println(book.toString());
}
4.谷歌的Java对象转json
private static void gObjectToSson() {
//创建json对象
Gson gson = new Gson();
//创建book对象
Book book = new Book(1001,"金色气球","气球真好看");
//转换
String s = gson.toJson(book);
System.out.println(s);
}
5.阿里的json转Java对象
private static void aliJsonToObject() {
//报错
/*String json = "\"id\":1002,\"info\":\"气球真好玩!\",\"name\":\"金色气球\"";
Book book = JSON.parseObject(json,Book.class);
System.out.println(book.toString());*/
//["yiersan","一二三","123"]
List<String> s = JSON.parseArray("[\"yiersan\",\"一二三\",\"123\"]", String.class);
for (String string: s) {
System.out.println(string);
}
}
6.阿里的Java对象转json
private static void aliObjectToJson() {
//创建book对象
Book book = new Book(1002,"金色气球","气球真好玩!");
String json = JSON.toJSONString(book);
System.out.println(json);
}