XML
extensible markup language 可扩展标记语言
特性:平台无关性,独立的标记语言,自我描述性
XML文档
CDATA
< ! [CDATA [ 内容 ] ] >
Java解析XML
SAX解析
解析方式是事件驱动机制 !
SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触
发事件.
我们可以编写程序在这些事件发生时, 进行相应的处理.
优点:
分析能够立即开始,而不是等待所有的数据被处理
逐行加载,节省内存.有助于解析大于系统内存的文档
有时不必解析整个文档,它可以在某个条件得到满足时停止解析.
缺点:
1. 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐
行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了).
2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系.
3. 只读解析方式, 无法修改XML文档的内容.
DOM解析
是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个
文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.
优点:
文档在内存中加载, 允许对数据和结构做出更改.
访问是双向的,可以在任何时候在树中双向解析数据。
缺点:
文档全部加载在内存中 , 消耗资源大.
JDOM解析
目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一
个Java特定模型,JDOM一直得到大力推广和促进。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”
(根据学习曲线假定为20%)
优点:
使用具体类而不是接口,简化了DOM的API。
大量使用了Java集合类,方便了Java开发人员。
缺点:
没有较好的灵活性。
性能不是那么优异。
DOM4J解析
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath
支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表
示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用
的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用
DOM4J来读写XML。 目前许多开源项目中大量采用DOM4J , 例如:Hibernate
DOM4J解析本地XML文件
//创建文件的输入流
FileInputStream fis = new FileInputStream("Book.xml");
//创建一个XML的读取工具对象
SAXReader sr = new SAXReader();
//得到文档对象
Document doc = sr.read(fis);
//获取XML文件中的根对象
Element root = doc.getRootElement();
//获取根标记的名称
String rn = root.getName();
System.out.println(rn);
//根据子节点的名称,获取root节点的第一个与名称匹配的子节点
Element book1 = root.element("book");
//获取book1的标签属性
String book1id = book1.attributeValue("id");
System.out.println(book1id);
//获取book1的子节点(根据名称)
Element name1 = book1.element("name");
//获取子节点的内容
String s = book1.elementText("name");
//获取book1的多个子节点
List<Element> b1elements = book1.elements();
//打印获取的子节点list的内容
for (Element e:
b1elements) {
String text = e.getText();
System.out.println(text);
}
DOM4J解析网络XML文件
//获取XML资源的输入流
URL url = new URL("http://apis.juhe.cn/mobile/get? phone=" + phone +
"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection uc = url.openConnection();
InputStream is = uc.getInputStream();
//创建一个XML读取工具对象
SAXReader sr = new SAXReader();
//获取文档对象
Document doc = sr.read(is);
//获取XML文件的根对象
DOM4J-XPATH解析
//DOM4J-XPATH解析
URL url = new URL("http://apis.juhe.cn/mobile/get? phone=" + phone +
"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection uc = url.openConnection();
InputStream is = uc.getInputStream();
SAXReader sr = new SAXReader();
Document doc = sr.read(is);
//方法1:获取与之匹配的单个Node对象,Node是Element和Document的父接口
Node node = doc.selectSingleNode("//company");
String text = node.getText();
System.out.println("运营商:"+text);
//方法2:获取与之匹配的多个Node对象
//List<Node> l = doc.selectNodes("路径表达式");
//记得要关闭输入流
is.close();
Java生成XML
//创建空的文档对象
Document doc = DocumentHelper.createDocument();
//通过文件对象,向其中添加根节点
Element root = doc.addElement("Books");
//创建root的子节点
Element book1 = root.addElement("book");
//创建book1的属性
Element book1id = book1.addAttribute("id", "001");
//写入book1的内容
book1.setText("骆驼祥子");
//创建输出流对象
FileOutputStream f = new FileOutputStream("NewBook.xml");
//将输出流转换为XML输出流
XMLWriter xw = new XMLWriter(f);
//写入文档
xw.write(doc);
//释放资源
xw.close();
XStream生成XML
Person p1 = new Person("小五","18");
//创建XStream对象
XStream xs = new XStream();
//修改生成的节点名称
xs.alias("haha",Person.class);
//将对象生成XML字符串
String s = xs.toXML(p1);
System.out.println(s);
JSON
谷歌 Gson
//把对像转化为JSON字符串
String s = new Gson().toJSON(new Person("lilei","18"));
//把JSON语句转化为对像
String json = "{\"name\":\"lilei\",\"age\":\"12\"}"
Person p = new Gson().fromJSON(json,Person.class);
//把JSON语句转化为map类型
HashMap m = new Gson().fromJSON(json,HashMap.class);
m.get("name");
阿里 FastJson
//把对像转化为JSON字符串
String s = JSON.toJSONString(new Person("lilei","18"));
//把JSON语句转化为对像
String json = "{\"name\":\"lilei\",\"age\":\"12\"}"
Person p = JSON.parseObject(json,Person.class);
//转换数组
String json1 = "[\"教练\",\"和\"]";
List<String> strings = JSON.parseArray(json1, String.class);
System.out.println(strings.get(0));