XML和JSON

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));
上一篇:洛谷P3958 奶酪


下一篇:c++ 结构