星星博客 »  > 

常用类库_XML与JSON的使用

XML

一、简介

含义

XML是可扩展标记语言(extensible Markup Language)
特性:

  1. xml具有平台无关性, 是一门独立的标记语言.
  2. xml具有自我描述性

用途

  1. 网络数据传输.
  2. 数据存储
  3. 配置文件

.XML文件

  1. .XML文件是保存XML数据的一种方式 ;
  2. XML数据也可以以其他的方式存在(如在内存中构建XML数据);

二、XML的使用

语法格式

1.XML文档声明

<?xml version="1.0" encoding="UTF-8"?>

2.标记(元素/标签/节点)

例:西游记
开始标记:<标记名称>
结束标记:</标记名称>
·标记名称需遵守以下命名规则:

  1. 名称可以为字母数字及其他字符
  2. 名称不能以数字或标点符号为开头
  3. 名称不能以"xml"(不区分大小写)为开始
  4. 名称不能包含空格,不能包含冒号
  5. 名称区分大小写
    ·开始标记和结束标记之间为标记内容

3.一个XML文档中必须且只能有一个根标记

4.标记可以嵌套,但不能交叉

5. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)

<?xml version="1.0" encoding="UTF-8"?>
<a001>
    <a002>
        <a003>哈哈</a003>
        <a004>呵呵</a004>
    </a002>
</a001>

相差一代:
a003是a002的子标记,也是后代标记
a002是a003的父标记
相差两代:
a001是a003的祖先标记
a003是a001的后代标记
同代:
a003是a004的兄弟标记

6.标记名称,允许重复

7.标记属性

格式:
1.在开始标记中, 描述属性.
2.可以包含0-n个属性, 每一个属性是一个键值对!
3.属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
4.属性值 必须被引号引住.

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="1001" group="玄幻">
        <name>小明修仙记</name>
        <info>小明称霸小学界的艰苦历程</info>
    </book>
    <book id="1002" group="言情">
        <name>花落知多少</name>
        <info>你猜呀,猜对也不告诉你</info>
    </book>
</books>

8.注释

开始:<!-- 
结束:-->

9.CDATA

CDATA 部分中的所有内容都会被解析器忽略。
开始:<![CDATA[

结束: ]]>

三.Java解析XML 掌握

1.四种解析方式

(1)SAX解析

逐行读取XML文件,解析时触发时间
优点:
1.可立即分析,不用加载XML中的所有数据
2.逐行加载,结束释放,节省内存
3.条件满足可停止,不必全部解析
缺点:
1.无法同时访问文档不同部分(访问过即释放)
2.无法得知元素层次,只能维护当前的父/子关系
3.只读,无法修改

(2)DOM解析

分析需要加载整个文档,建立文档树模型,程序员可通过操作文档数,完成数据的删、改、查;
优点:
1.文档加载至内存,可以修改;
2.访问时双向的,可以在任何时候在树中双向解析数据
缺点:
文档全部加载在内存中,耗费资源较大

(3)JDOM解析

第一个JAVA特定模型,比DOM实现更快

(4)DOM4J解析

JDOM的一种智能分支,包括集成的XPath支持、XML、Schema支持及用于大文档或流化文档的基于事件的处理;

2.DOM4J解析XML

(1)步骤

1.引入jar文件dom4j,jar
2.创建一个指向XML的文件输入流
3.创建一个XML的读取工具对象
4.使用读取工具读取XML文档的输入流,得到文档对象
5.用文档对象获取文档根元素

(2)文档对象 Document常用方法

  1. 通过文档对象, 获取XML文档中的根元素对象
    Element root = doc.getRootElement();
  2. 添加根节点
    Element root = doc.addElement(“根节点名称”);

(3)元素对象Element常用方法

  1. 获取节点名称
    String getName();
  2. 获取节点内容
    String getText();
  3. 设置节点内容
    String setText();
  4. 根据子节点的名称 , 获取匹配名称的第一个子节点对象
    Element element(String 子节点名称);
  5. 获取所有的子节点对象
    List elements();
    6.获取节点的属性值
    String attributeValue(String 属性名称);
  6. 获取子节点的内容
    StringelementText(String 子节点名称);
  7. 添加子节点
    Element addElement(String 子节点名称);
  8. 添加属性
    void addAttribute(String 属性名,String 属性值);

(4)本地文件解析案例

public class Books {
    public static void main(String[] args) throws IOException, DocumentException {
        //第一步,引入jar包
        //第二步,创建XML文件的输入流
        FileInputStream fis = new FileInputStream("D:\\books.xml");
        //第三步,创建XML读取工具
        SAXReader sr = new SAXReader();
        //第四步,用读取工具将XML的输入流读取为文档对象
        Document doc = sr.read(fis);
        //第五步,通过文档对象获取根元素(根标签)
        Element root = doc.getRootElement();

        //元素方法一:获取元素名
        System.out.println(root.getName());
        //元素方法二:获取指定名称元素,及元素内容
        Element book = root.element("book");
        Element name =book.element("name");
        System.out.println(book.getText());
        System.out.println(name.getText());
        //元素方法三:获取元素属性
        System.out.println(book.attributeValue("id"));
        //元素方法四:获取子标签内容
        System.out.println(book.elementText("info"));
        fis.close();
    }
}

(5)网络文件解析案例

public class Demo {
    public static void main(String[] args) throws IOException, DocumentException {
        // 1 获取XML输入流(链接要加双引号)
        URL url = new URL("http://apis.juhe.cn/mobile/get?phone=18726367343&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        // 1.1 打开网址
        URLConnection ucn = url.openConnection();
        // 1.2将网址连接转换为流
        InputStream is = ucn.getInputStream();
        // 2 创建读取工具
        SAXReader sr = new SAXReader();
        // 3 读取网络XML为文件
        Document doc = sr.read(is);
        // 4.获取根元素
        Element root = doc.getRootElement();
    }
}

3.XPATH解析

路径表达式:

  1. / : 从根节点开始查找
  2. // : 从发起查找的节点位置 查找后代节点 ***
  3. . : 查找当前节点
  4. … : 查找父节点
  5. @ : 选择属性. * 属性使用方式: [@属性名=‘值’] [@属性名>‘值’] [@属性名<‘值’] [@属性名!=‘值’]
public class Demo1 {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {
        //第二步,创建XML文件的输入流
        FileInputStream fis = new FileInputStream("D://books.xml");
        //第三步,创建XML读取工具
        SAXReader sr = new SAXReader();
        //第四步,用读取工具将XML的输入流读取为文档对象
        Document doc = sr.read(fis);
        // 查找后代节点
        List<Node> names = doc.selectNodes("//name");
        for(int i=0;i<names.size();i++){
            System.out.println(names.get(i).getName());
            System.out.println(names.get(i).getText());
        }
    }
}

4.XML的生成

步骤:

  1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象
    Document doc = DocumentHelper.createDocument();
  2. 通过文档对象, 向其中添加根节点
    Element root = doc.addElement(“根节点名称”);
  3. 通过根节点对象root , 丰富我们的子节点
    Element e = root.addElement(“元素名称”);
  4. 创建一个文件输出流 ,用于存储XML文件
    FileOutputStream fos = new FileOutputStream(“要存储的位置”);
  5. 将文件输出流, 转换为XML文档输出流
    XMLWriter xw = new XMLWriter(fos);
  6. 写出文档
    xw.write(doc);
  7. 释放资源
    xw.close();

四、JSON

1.JSON介绍

JSON: { “name”:“金苹果”, “info”:“种苹果” }
一个对象, 由一个大括号表示. 括号中 描述对象的属性 .
格式:
键与值之间使用冒号连接,多个键值对之间使用逗号分隔.
键值对的键 应使用引号引住
键值对的值,可以是JS中的任意类型的数据

2.json解析

Gson

转换JSON字符串的步骤:

  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
    String json = new Gson().toJSON(要转换的对象);

在需要转换Java对象的位置, 编写如下代码:
对象 = new Gson().fromJson(JSON字符串,对象类型.class);

public class Demo2 {
    public static void main(String[] args) {
        // 1 创建Gson对象
        Gson g = new Gson();
        // 2 创建对象
        Book book = new Book("1001","西游记","取经的故事和事故");
        // 3 转换为字符串
        String s = g.toJson(book);
        System.out.println(s);

        // 转回对象,指定json内容和要转换的类型
        Book book2 = g.fromJson("{\"id\":\"1001\",\"name\":\"西游记\",\"info\":\"取经的故事和事故\"}",Book.class);
        System.out.println(book2.toString());
    }
}

打印:

{"id":"1001","name":"西游记","info":"取经的故事和事故"}
book{id='1001', name='西游记', info='取经的故事和事故'}

FastJson

转换JSON字符串的步骤:

  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
    String json=JSON.toJSONString(要转换的对象);
    在需要转换Java对象的位置, 编写如下代码:
    类型 对象名=JSON.parseObject(JSON字符串, 类型.class);

    List<类型> list=JSON.parseArray(JSON字符串,类型.class);
public class Demo3 {
    public static void main(String[] args) {
        Book book = new Book("1002","很纯很暧昧","比想象的要正经");
        // 转换为json字符串
        String s = JSON.toJSONString(book);
        System.out.println(s);

        // 用json字符串转换回对象
        Book book2 = JSON.parseObject("{\"id\":\"1002\",\"info\":\"比想象的要正经\",\"name\":\"很纯很暧昧\"}",Book.class);
        System.out.println(book2.toString());
    }
}

打印:

{"id":"1002","info":"比想象的要正经","name":"很纯很暧昧"}
book{id='1002', name='很纯很暧昧', info='比想象的要正经'}

结束

相关文章