XML与JSON

本文对比了XML和JSON两种常见的数据交换格式,探讨了它们的特性、应用场景,解析方法(SAX、DOM、DOM4J、JDOM),以及在实际开发中的优缺点和适用场景。重点讲解了XML文件结构和解析规则,以及JSON的简洁语法和优势。
摘要由CSDN通过智能技术生成

XML和JSON

XML(了解)

1 简介

XML:XML是一种可标记语言,其特性如下:

1.平台性,一门独立的标记语言。比如XML进行解析时,在不同系统中的表现形式相同。

2.自我描述性。

2 XML应用

1 网络的数据传输

2 数据存储

3 配置文件

3 xml文件

.xml文件是保存XML数据的一种方式,xml数据可以从其他的方式存在。

1、必须有声明语句。

XML声明是XML文档的第一句,其格式如下:

<?``xml` `version``=``"1.0"` `encoding``=``"utf-8"``?>
2、注意大小写

在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。 [4]

3、XML文档有且只有一个根元素

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。

4、属性值使用引号

在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

5、所有的标记必须有相应的结束标记

在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。

6、所有的空标记也必须被关闭

空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。

7、 标记可以嵌套,但不能交叉

以下是正确例子:

<person>
    <name>李四</name>
    <age>18</age>
</person>

4 解析xml

1.SAX解析

sax解析是一种以事件驱动机制为方式的解析

它通过逐行读取xml文件解析。每当触碰到标签开始、内容、属性、结束事件时,我们可以编写程序在这些事件发生时进行相应处理。

2.DOM解析

DOM解析是用与平台和语言无关的方式表示XML文档的w3c标准。该结构下的分析通常需要加载整个文件,在内存中建立文档树模型。程序员能在文档树下完成数据获取、删除、修改。

3.JDOM解析

特征:

1、仅使用具体类,而不使用接口。

2、API大量使用了Collections类。

4.DOM4J解析

特征:

1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。

2、它使用接口和抽象基本类方法。

3、具有性能优异、灵活性好、功能强大和极端易用的特点。

4、是一个开放源码的文件

总结四个解析:DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

5.xml读取流程

1.解析本地文件

public static void main(String[] args){
    //1.获取输入流
    FileInputStream fis = new FileInputStream(name:xml文件);
    //2.创建xml读取对象
    SAXReader sr = new SAXReader();
    //3.读取并得到文档对象
    Document doc = sr.read(fis);
    //4.通过文档获取根元素
    Element root = doc.getRootElement();
    //5.开始解析元素
    system.out.println(root.getName);
    fis.close;  
}

2.解析网络文件

  String phone = "12345678910";        
//1.    获取到XML资源的输入流
    URL url = new URL("http://apis.juhe.cn/mobile/getphone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");     
    URLConnection conn = url.openConnection();
    InputStream is = conn.getInputStream();        
//2.    创建一个XML读取对象
    SAXReader sr = new SAXReader();
//3.    通过读取对象读取XML数据,并返回文档对象        
    Document doc = sr.read(is);
//4.    获取根节点
    Element root = doc.getRootElement();        
//5.    解析内容
    String code = root.elementText("resultcode");//将查询成功内容取出      
    if("200".equals(code)){
        Element result = root.element("result");
        String province = result.elementText("province");              
        String city = result.elementText("city");
        if(province.equals(city)){
            System.out.println("手机号码归属地为:"+city);            }
        else{
               System.out.println("手机号码归属地为:"+province+" "+city);        
        }
    }
    else{
        System.out.println("请输入正确的手机号码");      
    }
6 xpath
通过路径快速的查找一个或一组元素 路径表达式:
   1.  /   :   从根节点开始查找
   2.  //  :   从发起查找的节点位置     查找后代节点         ***    3.  .   :   查找当前节点
   4.  ..  :   查找父节点
   5.  @   :   选择属性. *    
属性使用方式:    
[@属性名='值']    
[@属性名>'值']
[@属性名<'值']
        [@属性名!='值']
   books:   
        路径: //book[@id='1']//name    books
book id=1
    name 
    info
book id=2
    name 
    info

5 JAVA中生成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(); 


案例:
//1.    通过文档帮助器, 创建空的文档对象
       Document doc = DocumentHelper.createDocument();        
//2.    向文档对象中, 加入根节点对象
       Element books = doc.addElement("books");        
//3.    向根节点中     丰富子节点
       for(int i=0;i<1000;i++) {
           //向根节点中加入1000个book节点.
           Element book = books.addElement("book");            
           //向book节点, 加入id属性
           book.addAttribute("id", 1+i+"");            
           //向book节点中加入name和info节点
          Element name = book.addElement("name");           
          Element info = book.addElement("info");           
          name.setText("苹果"+i);
          info.setText("哈哈哈"+i);      }
//4.    创建文件的输出流
          FileOutputStream fos = new FileOutputStream("c:\\books.xml");  
//5.    将文件输出流, 转换为XML文档输出流
          XMLWriter xw = new XMLWriter(fos);        
//6.    写出XML文档
          xw.write(doc);       
//7.   释放资源       
          xw.close();
          System.out.println("代码执行完毕");

6 XStream使用和了解

快速的将Java中的对象, 转换为XML字符串. 
使用步骤:
对象格式
1.  创建XStream 对象
       XStream x = new XStream();
[2].修改类生成的节点名称(默认节点名称为包名.类名)        
       x.alias("节点名称",类名.class);
3.  传入对象,生成XML字符串
       String xml字符串= x.toXML(对象); 


案例:
       Person p = new Person(1001, "张三", "不详");   
       XStream x = new XStream();
       x.alias("haha", Person.class);    
       String xml = x.toXML(p);
       System.out.println(xml);

Json简介

​ JSON:JS对象简谱, 是一种轻量级的数据交换格式,是存储和交换文本信息的语法,类似 XML。

JSON 比 XML 更小、更快,更易解析。

{
    "sites": [
    { "name":"book1" , "url":"www.book1.com" }, 
    { "name":"book2" , "url":"www.book2.com" }, 
    { "name":"book3" , "url":"www.book3.com" }
    ]
}

其中,sites 对象是包含 3 个站点记录(对象)的数组。

1 什么是JSON

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)。
  • JSON 是轻量级的文本数据交换格式。
  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
  • JSON 具有自我描述性,更易理解。

JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。

由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象

2 JSON 语法规则

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组,数组可以包含多个对象

1.JSON 名称/值对

JSON 数据的书写格式是:

key : value

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

"name" : "book"

这很容易理解,等价于这条 JavaScript 语句:

name = "book"
2.JSON 值

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null
3.JSON 数字

JSON 数字可以是整型或者浮点型:

{ “age”:30 }

4.JSON 对象

JSON 对象在大括号 {} 中书写:

{key1 : value1, key2 : value2, ... keyN : valueN }

对象可以包含多个名称/值对:

{ "name":"菜鸟教程" , "url":"www.runoob.com" }

这一点也容易理解,与这条 JavaScript 语句等价:

name = "菜鸟教程" url = "www.runoob.com"
5.JSON 数组

JSON 数组在中括号 [] 中书写:

数组可包含多个对象:

[
    { key1 : value1-1 , key2:value1-2 }, 
    { key1 : value2-1 , key2:value2-2 }, 
    { key1 : value3-1 , key2:value3-2 }, 
    ...
    { keyN : valueN-1 , keyN:valueN-2 }, 
]
{    "sites": [        { "name":"菜鸟教程" , "url":"www.runoob.com" },         { "name":"google" , "url":"www.google.com" },         { "name":"微博" , "url":"www.weibo.com" }    ] }

在上面的例子中,对象 sites 是包含三个对象的数组。每个对象代表一条关于某个网站(name、url)的记录。

6.JSON 布尔值

JSON 布尔值可以是 true 或者 false:

{ "flag":true }
7.JSON null

JSON 可以设置 null 值:

{ "runoob":null }
8.JSON 使用 JavaScript 语法

因为 JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON。

通过 JavaScript,您可以创建一个对象数组,并像这样进行赋值:

实例

var sites = [    { "name":"runoob" , "url":"www.runoob.com" },     { "name":"google" , "url":"www.google.com" },     { "name":"微博" , "url":"www.weibo.com" } ];

可以像这样访问 JavaScript 对象数组中的第一项(索引从 0 开始):

sites[0].name;

返回的内容是:

runoob

可以像这样修改数据:

sites[0].name="菜鸟教程";
9.JSON 文件
  • JSON 文件的文件类型是 .json
  • JSON 文本的 MIME 类型是 application/json
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao艾扶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值