XML与JSON概述以及使用示例

  • 时间:
  • 来源:互联网
  • 文章标签:

1 xml语法

eXtensible Markup Language 可扩展标记语言

特性:
1.xml具有平台无关性,是一门独立的标记语言
	无关性表现在不同操作系统中显示效果都一样,在不同的编程语言中解析结果都一样,xml不依赖任何语言;
2.xml具有自我描述性

学习意义

1.方便网络传输数据(JSON占多数)
2.进行数据存储
3.作为配置文件(XML用的最多的地方)

XML语法格式

1.XML文档声明(必须放在第一行)
<?xml version="1.0" encoding="UTF-8"?>

2.标记
xml文档是由一个个的标记组成,也叫做元素/标签/节点
由开始标记和结束标记组成,例如		<标记名称> 标记内容 </标记名称>

	标记名称:是自定义名称,必须遵守以下命名规则:
			a.名称可以包含字母,数字以及其他字符
			b.名称不能以数字或者标点符号开始
			c.名称不能以 "xml" 开始(不论是否大小写)
			d.名称不能包含空格和冒号
			e.名称区分大小写
			
    标记内容:开始标记和结束标记之间的内容
    
   一个xml文档中只能包含一个根标记,例如:
       <Books>			
            <book>
                <name>汤姆索亚历险记</name>
                <price> 199.00 </price>
            </book>
            <book>
                <name>钢铁是怎样炼成的</name>
                 <price> 299.00 </price>
            </book>
       </Books>
    在这个例中中,<Books></Books>就是根标记

	标记可以嵌套,但是不允许交叉;例如 <name>钢铁是怎样炼成的<price></name>299</price>是错误的
	
	标记层称呼:子标记、父标记、兄弟标记、后代标记、祖先标记;
	
	标记除了开始和结束,还可以有属性;例如下例中的 id 和 groupId;
		属性可以有多个,每一个属性是键值对;属性名不可重复;属性值必须用引号引住。
		<Books>
			<book id="1001" groupId="1">
				<name>汤姆索亚历险记</name>
                  <price> 199.00 </price>
			</book>
		</Books>
	
xml注释:<!-- 注释内容 -->
注释不可写在文档声明前,注释不能嵌套
语法进阶 CDATA:
CDATA里面的内容不会被 xml 解析器解析,可以用来包含一些像 "<" "&" 等之类的非法字符

格式:
<![CDATA[[ 内容  ]]>

2 xml解析方式

2.1 SAX解析

形象理解就是读文章时一行一行地读。

解析方法是事件驱动机制!

逐行读取 xml 文件解析,每当解析到一个标签的开始/结束/内容/属性时,触发事件。

优点:

1.分析能够立刻开始,不需要等待所有数据被处理
2.逐行读取,节省内存空间,理论上可以解析大于系统内存的文档
3.有时不必解析整个文档,它可以在某个条件得到满足时就停止解析

缺点:

1.解析是单向的,无法定位文档层次,无法同时访问统一文档的不同部分数据(每读取一行,前面读取过的数据都被释放)
2.无法得知事件发生时的层次,只能开发者自己维护节点的父/子关系
3.只读解析方式,不能修改xml文档的内容

2.2 DOM解析

形象理解就是看文章时要先把文章全背下来

是用与平台无关的的方式表示xml文档的官方w3c标准,分析该结构通常需要加载整个文档和在内存中建立文档树模型,程序员可以通过操作文档树,来完成数据的获取、修改、删除等。

优点:

1.文档在内存中加载,允许对数据和结构做出更改
2.访问是双向的,可以在任何时候在树中双向解析数据

缺点:

文档需要全部加载在内存中,相对而言比较消耗资源。
(实际上,我们的xml文件一般都不大,一次性加载到内存占用的空间几乎几乎没影响)

2.3 JDOM解析

简化了与 xml 的交互并且比使用 DOM 实现更快。

优点:

1.使用了具体的类而不是接口,简化了DOM的API
2.大量使用了Java集合类,方便了开发人员

缺点:

1.灵活性不是很好
2.性能不够优异

2.4 DOM4J

它是JDOM的一种只能分支,合并了许多超出基本xml文档表示的功能,包括集成的 XPath 支持等

优点:

性能优异,使用简便

3 解析XML

xml文件如下:

<Books>
    <book id="1001">
        <name>汤姆索亚历险记</name>
        <price> 199.00 </price>
    </book>
    <book id="1002">
        <name>钢铁是怎样炼成的</name>
        <price> 299.00 </price>
    </book>
</Books>

3.1DOM4J解析xml

	   //1.获取文件输入流
        FileInputStream fis = new FileInputStream("E:\\JavaCode\\kaikeba\\Java-ch4\\src\\section8_XML_JSON\\book.xml");
        //2.创建xml读取工具对象
        SAXReader sr = new SAXReader();
        //3.通过读取工具,获得文档的输入流并获得文档对象
        Document data = sr.read(fis);
        //4.通过文档对象,获取文档的根节点对象
        Element root = data.getRootElement();
        //5.通过跟节点,获取所有子节点
        List<Element> elements = root.elements();
        //6.循环遍历节点
        for (Element e : elements) {
            String id = e.attributeValue("id");
            String name = e.elementText("name");
            String price = e.elementText("price");
            System.out.println("id=" + id + " ,name=" + name + " price= " + price);
        }
        fis.close();

/*输出结果:
id=1001, name=汤姆索亚历险记 price= 199.00 
id=1002, name=钢铁是怎样炼成的 price= 299.00 
*/

3.2DOM4J-XPATH解析xml

基本语法格式:

通过路径快速的查找一个或一组元素:

1.	/  	: 	从根节点开始查找
2.	//	:	从发起查找的节点位置开始查找后代节点(重点使用)
3.	.	:	查找当前节点
4.	..	:	查找父节点
5.	@	:	选择属性
			[@属性名='值']
			[@属性名>'值']
			[@属性名<'值']
			[@属性名!='值']
		//1.获取文件输入流
        FileInputStream fis = new FileInputStream("E:\\JavaCode\\kaikeba\\Java-ch4\\src\\section8_XML_JSON\\book.xml");
        //2.创建xml读取工具对象
        SAXReader sr = new SAXReader();
        //3.通过读取工具,获得文档的输入流并获得文档对象
        Document data = sr.read(fis);
        //4.通过文档对象,获取文档的根节点对象([@id='1001']表示获取id属性为1001的节点对象)
        List<Node> list = data.selectNodes("//book//name");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getName());
            System.out.println(list.get(i).getText());
        }
        //获取单个节点对象
       Node node = data.selectSingleNode("//book[@id='1001']//name");
       System.out.println(node.getName() +":" + node.getText());
       fis.close();

/*输出结果:
name
汤姆索亚历险记
name
钢铁是怎样炼成的
name:汤姆索亚历险记
*/

4 XML生成

4.1Java生成XML

        //1.通过文档帮助器(DocumentHelper)创建文档对象
        Document doc = DocumentHelper.createDocument();
        //2.向文档对象中添加根节点
        Element root = doc.addElement("books");
        //3.向根节点中添加子节点
        for (int i = 0; i < 3; i++) {
            //向根节点books添加3个book子节点
            Element book = root.addElement("book");
            //向book节点添加id属性
            book.addAttribute("id", 1 + i + "");
            //向book节点中添加name和price节点
            Element name = book.addElement("name");
            Element price = book.addElement("price");
            //设置name和price的内容
            name.setText("Java编程" + i);
            price.setText("199");
        }
        //4.创建文件的输出流
        FileOutputStream fos = new FileOutputStream("E:\\JavaCode\\kaikeba\\Java-ch4\\src\\section8_XML_JSON\\booksDemo4.xml");
        //5.将文件输出流转换为文档输出流
        XMLWriter xw = new XMLWriter(fos);
        //6.写出xml文档
        xw.write(doc);
        //7.释放资源
        xw.close();
        fos.close();

/*输出结果:
<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="1">
        <name>Java编程0</name>
        <price>199</price>
    </book>
    <book id="2">
        <name>Java编程1</name>
        <price>199</price>
    </book>
    <book id="3">
        <name>Java编程2</name>
        <price>199</price>
    </book>
</books>
*/

4.2XStr3eam生成XML字符串

	   //新建一个图书对象
        Book b1 = new Book("数据库从删库到跑路", "299");
        //创建XStream对象
        XStream x = new XStream();
        //可选操作,修改某个类型生成的节点,默认为包名.类名
        x.alias("book", Book.class);
        //根据b1对象生成xml字符串
        String s = x.toXML(b1);
        System.out.println(s);

/*输出结果:
<book>
  <name>数据库从删库到跑路</name>
  <price>299</price>
</book>
*/

5 JSON

JavaScript Object Notation JS对象简谱,是一种轻量级的数据交换格式。

Json表示一本书的语法格式:

{
	"name":"Java从入门到入土",
	"price":"299"
}

一个对象由一对 {} 括起来;
括号中描述的是对象的属性,属性的键与值之间使用 : 进行分隔,对于数值类型的数据和布尔类型数据可以不用引号;
在Java中,键值对中的键需要使用引号。

6 解析JSON

导入相应的 jar 包:image-20201024104338927

一个是阿里的解析工具,另一个是谷歌的解析工具。

		Book book = new Book("Java设计模式", "99");
        /*-------------谷歌解析------------------*/
        //把对象转换成json字符串
        String json = new Gson().toJson(book);
        System.out.println(json);
        //把json格式字符串转换成对象
        Book book1 = new Gson().fromJson(json, Book.class);
        System.out.println(book1.getPrice());
        System.out.println(book1);

        /*------阿里解析----------------------*/
        //把对象转换成json字符串
        String s = JSON.toJSONString(book);
        System.out.println(s);
        //把json格式字符串转换成对象
        Book book2 = JSON.parseObject("{\"name\":\"Java设计模式\",\"price\":\"99\"}", Book.class);
        System.out.println(book2.getName());
        System.out.println(book2);

本文链接http://www.taodudu.cc/news/show-1781890.html