XMl简介:

  •  1.可扩展标记语言(eXtensible Markup Language)。
    特性:
     1. xml具有平台无关性, 是一门独立的标记语言.
     2. xml具有自我描述性
  • 2. 标记 ( 元素 / 标签 / 节点) 
       XML文档,由一个个的标记组成.
       语法:
         开始标记(开放标记): <标记名称>
         结束标记(闭合标记): </标记名称>
         标记名称:  自定义名称,必须遵循以下命名规则:
    1.名称可以含字母、数字以及其他的字符
    2.名称不能以数字或者标点符号开始
    3.名称不能以字符 “xml”(或者 XML、Xml)开始
    4.名称不能包含空格,不能包含冒号(:)
    5.名称区分大小写
         标记内容:  开始标记与结束标记之间 ,是标记的内容.
       例如 ,我们通过标记, 描述一个人名:
         <name>张三</name>
  • 3. 一个XML文档中, 必须有且且仅允许有一个根标记.
       正例:
         <names>
           <name>张三</name>
           <name>李四</name>
         </names>
       反例:
         <name>李四</name>
         <name>麻子</name>
  • 4. 标记可以嵌套, 但是不允许交叉.
       正例:
         <person>
           <name>李四</name>
           <age>18</age>
         </person>
       反例:
         <person>
           <name>李四<age></name>
           18</age>
         </person>
  • 5. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)
       例如:
         <persons>
           <person>
             <name>李四</name>
             <length>180cm</length>
           </person>
           <person>
             <name>李四</name>
             <length>200cm</length>
           </person>
         </persons>
       name是person的子标记.也是person的后代标记
       name是persons的后代标记.
    案例:
    语法进阶CDATA 
       name是length的兄弟标记.
       person是name的父标记.
       persons是name的祖先标记.
  • 6. 标记名称 允许重复

7. 标记除了开始和结束 , 还有属性.
   标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.
   格式:
     在开始标记中, 描述属性.
     可以包含0-n个属性, 每一个属性是一个键值对!
     属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
     属性值 必须被引号引住.
   案例:
     <persons>
       <person id="10001" groupid="1">
         <name>李四</name>
         <age>18</age>
       </person>
       <person id="10002" groupid="1">
         <name>李四</name>
         <age>20</age>
       </person>
     </persons>

解析本地文件案例:

package com.demo;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

/**
 * @Author: 八a哥
 * @Description:
 * @Date Created in 2022-04-15 17:24
 * @Modified By:
 */

public class Demo04 {
    public static void main(String[] args) throws IOException, DocumentException {
//        1.创建输入流
        FileInputStream fis = new FileInputStream("E:\\data\\Demo1.xml");
//        2.创建XMl读取对象
        SAXReader sr = new SAXReader();
//        3.读取并得到文档对象
        Document doc = sr.read(fis);
//        4.通过文档对象+xpath,查找所有的name节点
        List<Node> name = doc.selectNodes("//book[@id='1001']//name");
        for (int i = 0;i<name.size(); i++){
            System.out.println(name.get(i).getName());
            System.out.println(name.get(i).getText());
        }
        fis.close();
    }
}

解析网络文件案例:

package com.demo;


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class Demo05 {
    public static void main(String[] args) throws DocumentException, IOException {
        String phone = "13375276751";
//        1.获取到xml资源的输入流
        URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        URLConnection coon =  url.openConnection();
        InputStream is = coon.getInputStream();
//        2.创建一个xml读取对象
        SAXReader sr = new SAXReader();
//        3.通过读取对象 读取xml数据 并返回文档对象
        Document doc = sr.read(is);
//        4.获取根节点
        Element root = doc.getRootElement();
        Node node = doc.selectSingleNode("//company");
        System.out.println("该号码的运营商为:"+node.getText());

        is.close();


    }
}

 

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

 JSON格式:

一本书
书名
简介
java
   class Book{
     private String name;
     private String info;
数组格式
案例
     get/set...
   }
   Book b = new Book();
   b.setName(“金苹果”);
   b.setInfo(“种苹果”);
   ...
js:
   var b = new Object();
   b.name = "金苹果";
   b.info = "种苹果";
   
 XML:
 <book>
 <name>金苹果</name>
 <info>种苹果</info>
 </book>
 JSON:
 {
 "name":"金苹果",
 "info":"种苹果"
 }
一个对象, 由一个大括号表示.
   括号中 描述对象的属性 . 通过键值对来描述对象的属性
   (可以理解为, 大括号中, 包含的是一个个的键值对.)
   格式:
键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解
析.)
键值对的值, 可以是JS中的任意类型的数据。

将JSON字符串转换为对象:

 1 package com.java.demo2;
 2 
 3 import com.google.gson.Gson;
 4 
 5 public class Demo2 {
 6 
 7     public static void main(String[] args) {
 8         //1.    创建Gson对象
 9         Gson g = new Gson();
10         //2.    转换  :  {"id":"100","name":"金苹果","info":"种植苹果真辛苦"}
11         Book b = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果真辛苦\"}", Book.class);
12         System.out.println(b.getId());
13     }
14 }
将JSON字符串转换为对象
1
package com.java.demo2; 2 3 import com.alibaba.fastjson.JSON; 4 5 public class Demo5 { 6 public static void main(String[] args) { 7 8 //1. 转换 : {"id":"1002","info":"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。","name":"唐诗三百首"} 9 Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,地上鞋一堆。床上我杰哥,喊十块钱一双。\",\"name\":\"唐诗三百首\"}", Book.class); 10 System.out.println(book.getId()); 11 12 } 13 }


1
package com.java.demo2; 2 3 import com.alibaba.fastjson.JSON; 4 5 import java.util.List; 6 7 public class Demo6 { 8 public static void main(String[] args) { 9 10 //1. 转换 : ["一二三","二三四","三四五"] 11 List<String> strings = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class); 12 System.out.println(strings.get(1)); 13 14 } 15 }

 

最后我个人认为还是json更方便且流行性较高,JSON读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读。