目录
一、Java中有4种XML解析方式 及优缺点
1. SAX解析
2. DOM解析
3. JDOM解析
*4. DOM4J解析(多数使用)
二、xml与json的demo
1. demo.xml
2. dome.json
三、JAVA对象与XML/JSON互转代码
1. Java对象转化成xml
2. xml转换成Java对象
3.谷歌的json转Java对象
4.谷歌的Java对象转json
5.阿里的json转Java对象
6.阿里的Java对象转json
一、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);
}