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("http://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("http://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讀起來更像一個數據塊,讀起來就比較費解了。不過,我們讀起來費解的語言,恰恰是適合機器閱讀。