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));