XML与JSON详解(JAVA)
1.XML(可拓展标记语言)
注意:XML是一种语言,并不是专表示XML文件
1.1 XML特性
-
1.XML有平台无关性,是一门独立的标记语言
-
2.XML具有自我描述性
1.2 XML学习应用
-
-
网络数据传输(良好的可读性,可维护性)
-
-
-
数据存储(例:qq部分聊天记录)
-
-
-
配置文件
-
1.3 XML语法格式
1.3.1 声明(XML文档声明)
注意:一定要写在XML文档的第一行
<?xml version(版本) = "1.0" encoding(编码集) = "UTF-8" ?>
1.3.2 标记(元素/标签/节点)
具体语法是: 开始标记: <标记名称> 结束标记:</标记名称>
注意:标记名称
-
不能以数字或标点开始
-
名称不能以XML(不管大小写)开始
-
名称不能含空格,冒号
-
区别大小写
-
允许重复
-
可以嵌套
正确嵌套:<book>
<name>肖申克的救赎<id>10001</id></name>
</book>
错误嵌套:<book>
<name>肖申克的救赎<id>10001</name></id>
</book>
特殊的: 根标记:所有嵌套标记最为外层的标记(文档有且只有一个)
1.3.3 属性
属性在标记开始时,由属性名和属性值组成(都用引号引注),每一个属性都是一个键值对,不能重复,多个属性值用空格分隔。
<book groupId = "77340" type = "05" > (属性)
<name>肖申克的救赎</name>
<id>10001</id>
</book>
1.3.4 注释
注释不能写在文档声明前面,不能相互嵌套
格式:
<!-- 注释内容 -->
1.4 Java 如何解析xml
xml 既然作为机器与机器交流的语言,那各大语言就必然支持解析的工具,而java就有两种不同的解析方式,对比如下:
-
SAX解析(按行解读)
优点:
-
有助于解析大于系统内存文档
-
有时不必解析整个文档便能达到目的
缺点:
-
单向解析,无法回档
-
无法得知事件时元素层次
-
只读,无法进行操作
-
DOM解析(保存读取)
优点:
-
允许文档操作
-
访问是双向的
缺点:消耗资源大
总结:我们还是毫不犹豫的选择DOM解析方法,因为大多数使用情况我们都需要操作xml,更不用说数据库使用时,还有xml文档一般比较小,保存的都是对象级别,没有底层代码,所以使用DOM解析不会消耗过多的资源,所以上述优缺点不是绝对的,要看使用目的的不同。
1.5 DOM4J解析XML(掌握)
-
引入
当使用DOM4J解析xml文档时需要引入一系列 .jar文件 到项目的lib包中

再将保存了jar文件的库添加到项目中。
-
创建一个指向xml文件的输入流
FileInputStream fis = new FileInputStream("c://文档//demo.xml"); -
创建一个xml读取工具对象
SAXReader sr = new SAXReader();//这是自己导入的DOM4J中的方法 -
使用读取工具对象,读取xml文件输入流并得到文档对象
Document doc = sr.read(fis); //同上 -
通过文档对象,获取xml文档中的根元素对象
Element root = doc.getRootElement(); -
一顿操作猛如虎:
//操作一波 System.out.println(root.getName()); java.util.List<Element> es = root.elements(); for(int i = 0;i < es.size();i++) { Element book = es.get(i); System.out.println("该书的编号为:" + book.attributeValue("groupId") + " 名字为:" + book.elementText("name") + " 类型为: " + book.elementText("id")); }<?xml version = "1.0" encoding = "UTF-8" ?> <books> <book groupId = "77340" type = "05" > <name>肖申克的救赎</name> <id>10001</id> </book> <book groupId = "77341" type = "04" > <name>自卑与超越</name> <id>10002</id> </book> <book groupId = "77342" type = "04" > <name>被讨厌的勇气</name> <id>10003</id> </book> <book groupId = "77343" type = "02" > <name>国富论</name> <id>10004</id> </book> </books>结果为:
books 该书的编号为:77340 名字为:肖申克的救赎 类型为: 10001 该书的编号为:77341 名字为:自卑与超越 类型为: 10002 该书的编号为:77342 名字为:被讨厌的勇气 类型为: 10003 该书的编号为:77343 名字为:国富论 类型为: 10004 -
网络xml文件的解析也大同小异
一段利用聚合网站搜索的sml文档做出的小功能
-
public class WebTest { public static void main(String[] args) throws IOException, DocumentException { Scanner scanner = new Scanner(System.in); System.out.println("--欢迎来到手机号码查询归属地小程序--"); System.out.print("请输入你需要查询的手机号:"); String s = scanner.nextLine(); URL url = new URL("http://apis.juhe.cn/mobile/get?phone=" + s + "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"); URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); SAXReader sr = new SAXReader(); Document read = sr.read(is); Element e1 = read.getRootElement(); Element e = e1.element("result"); System.out.println(e1.getName()); System.out.println(e1.elementText("reason")); System.out.println("该号码的运营商为: " + e.elementText("company")); if(e.elementText("province") == e.elementText("city")){ System.out.println("该号码归属地为: " + e.elementText("city")); } else{ System.out.println("该号码归属地为: " + e.elementText("province") + "省 " +e.elementText("city") + "市"); } } }
1.6.DOM4J的XPATH解析xml文档
1. / : 从根节点查找 2. // : 从发起节点位置,查找后代 3. . : 当前节点 4. .. : 查找父代 5. @ : 选择属性 格式: [@ 属性名 =(> < !) "值" ] eg: //book[@ id = "1" ]//name 查id为1的book的所有name

XPATH 使用节点的方式来理解和解析xml文档
FileInputStream fis = new FileInputStream("D://demo.xml");
SAXReader sr = new SAXReader();
Document doc = sr.read(fis);
java.util.List<Node> names = doc.selectNodes("//name");
for (int i = 0; i < names.size(); i++) {
System.out.print(names.get(i).getName());
System.out.print(names.get(i).getText());
}
循环改进式节点输出
JSON(JS对象简谱)
是一种轻量级的数据交换形式
2.1 JSON格式
我们先来看不同语言表示对象的格式:
-
java
class Book{
private String name;
private String id;
get/set
hashcode/equals
toString()
}
-
JS
var b = new Object();
b.name = ("国富论");
b.id = ("10001");
-
xml
<books>
<book>
<name>国富论</name>
<id>10001</id>
</book>
</books>
而JSON就是以JS为基础,java思想为辅助,经过相当简化但使用严密的表示对象的语言。
{
"name":"国富论","id":"10001"
}
2.2 如何解析JSON
GSON 谷歌解析工具
-
引入jar包
-
转换对象
//GSON 的 对象转JSON形式 String json = new Gson().toJson(输入的对象); //输出结果 {"name":"国富论","id":"10001"}
-
对象转json
//Json字符串转对象
Book book1 = new Gson().fromJson(json, Book.class);
System.out.println(book1.getId());
System.out.println(book1.getName());
//10001
//国富论
FastJson 阿里解析工具
public static void main(String[] args) {
Book book = new Book();
book.setId("10001");
book.setName("国富论");
String json = JSON.toJSONString(book);
System.out.println(json);
Book b = JSON.parseObject(json,Book.class);
}
步骤一致,只是使用的自定义方法有点不同
本文详细介绍了XML和JSON的基础知识,包括XML的特性、应用、语法格式以及DOM4J解析XML的方法。同时,文章讲解了JSON的格式以及如何使用GSON和FastJson在JAVA中解析JSON。
2662

被折叠的 条评论
为什么被折叠?



