XML 與 JSON 相關知識點整理

      網友投稿 920 2025-03-31

      1. XML


      是一門可擴展標記語言(eXtensible Markup Language)。

      .xml文件只是保存XML數據的一種方式,也可以通過在內存中構建XML數據的方式保存,或者是其他方式。

      XML語言不等同于XML文件。

      1.1 XML的特性

      具有平臺無關性,是一門獨立的標記語言;

      具有自我描述性。

      1.2 XML的用途

      用于網絡中的數據傳輸(現在多用JSON);

      用于存儲數據;

      用于配置文件。

      1.3 XML語法格式

      1.3.1 XML文檔聲明

      標記自己是xml文件,版本1.0,編碼格式UTF-8。

      1.3.2 標記

      標記,即xml的元素、標簽。XML文檔是由多個標記組成的。

      開始標記(開放標記): <標記名稱> 結束標記(閉合標記):

      標記的語法使用規則:

      自定義名稱,必須遵循以下命名規則

      名稱可以含字母、數字以及其他的字符

      名稱不能以數字或者標點符號開始

      名稱不能以字符 “xml”(或者 XML、Xml)開始

      名稱不能包含空格,不能包含冒號(:)

      名稱區分大小寫

      開始標記與結束標記之間 ,是標記的內容;

      一個XML文檔中, 必須有且且僅允許有一個根標記;

      標記可以嵌套, 但是不允許交叉;

      標記的層級稱呼 (祖先標記、父標記 、兄弟標記、子標記、后代標記);

      標記名稱允許重復;

      標記除了開始和結束 , 還有屬性;

      標記中的屬性, 在標記開始時描述, 由屬性名和屬性值組成,可以包含0-n個屬性, 每一個屬性是一個鍵值對! 屬性名不允許重復 , 鍵與值之間使用等號連接, 多個屬性之間使用空格分割。屬性值必須被引號引住。

      //屬性有id和groupid 李四 18 李四 20

      注釋

      注釋不能寫在文檔文檔聲明前,注釋不能嵌套注釋。

      1.3.3 CDATA

      CDATA 是不應該由XML解析器解析的文本數據。 像 “<” 和 “&” 字符在 XML 元素中都是非法的。 “<” 會產生錯誤,因為解析器會把該字符解釋為新元素的開始。 “&” 會產生錯誤,因為解析器會把該字符解釋為字符實體的開始。

      某些文本,比如 JavaScript 代碼,包含大量 “<” 或 “&” 字符。為了避免錯誤,可以將腳本代 碼定義為 CDATA。 CDATA 部分中的所有內容都會被解析器忽略。 CDATA 部分由 “” 結束:

      1.4 Java解析XML

      常見面試題:Java中有幾種XML解析方式 ? 分別是什么 ? 有什么樣的優缺點 ?

      1.4.1 SAX解析

      1.4.1.1 解析方式

      事件驅動機制 , SAX解析器, 逐行讀取XML文件解析 , 每當解析到一個標簽的開始/結束/內容/屬性時,觸發事件。我們可以編寫程序在這些事件發生時, 進行相應的處理。

      1.4.1.2 優點

      分析能夠立即開始,而不是等待所有的數據被處理 ;

      逐行加載,節省內存,有助于解析大于系統內存的文檔;

      有時不必解析整個文檔,它可以在某個條件得到滿足時停止解析。

      1.4.1.3 缺點

      單向解析,無法定位文檔層次,無法同時訪問同一文檔的不同部分數據;

      (因為逐行解析, 當解析第n行是, 第n-1行已經被釋放了, 無法在進行操作了)

      無法得知事件發生時元素的層次, 只能自己維護節點的父/子關系;

      只讀解析方式, 無法修改XML文檔的內容。

      1.4.2 DOM解析

      1.4.2.1 解析方式

      是用與平臺和語言無關的方式表示XML文檔的官方W3C標準,分析該結構通常需要加載整個文檔和內存中建立文檔樹模型。程序員可以通過操作文檔樹, 來完成數據的獲取、修改、刪除等。

      1.4.2.2 優點

      文檔在內存中加載, 允許對數據和結構做出更改;

      訪問是雙向的,可以在任何時候在樹中雙向解析數據。

      1.4.2.3 缺點

      文檔全部加載在內存中 , 消耗資源大。

      1.4.3 JDOM解析

      1.4.3.1 解析方式

      目的是成為Java特定文檔模型,它簡化與XML的交互并且比使用DOM實現更快。由于是第一個Java特定模型,JDOM一直得到大力推廣和促進。

      JDOM文檔聲明其目的是“使用20%(或更少)的精力解決80%(或更多)Java/XML問題” 。

      1.4.3.2 優點

      使用具體類而不是接口,簡化了DOM的API;

      大量使用了Java集合類,方便了Java開發人員。

      1.4.3.3 缺點

      沒有較好的靈活性;

      性能不是那么優異。

      1.4.4 DOM4J解析

      1.4.4.1 解析方式

      它是JDOM的一種智能分支。它合并了許多超出基本XML文檔表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構建文檔表示的選項,如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML。

      1.4.4.2 優點

      具有性能優異、功能強大和極度易使用的特點;

      軟件開源。很多開源項目都大量采用DOM4J,例如:Hibernate。

      1.4.4.3 解析步驟

      引入jar文件,dom4j.jar;

      創建一個指向XML文件的輸入流;

      FileInputStream fis = new FileInputStream("XML文件地址");

      創建一個XML讀取工具的實例對象;

      SAXReader sr = new SAXReader();

      使用讀取工具對象,讀取XML文檔的輸入流,并得到文檔對象;

      Document doc = sr.read(fis);//XML建立的文檔樹模型

      通過文檔對象,讀取XML文檔中的根元素。

      Element root = doc.gerRootElement();

      1.4.4.4 文檔對象Document

      //常用方法: //1. 通過文檔對象, 獲取XML文檔中的根元素對象 Element root = doc.getRootElement(); //2. 添加根節點 Element root = doc.addElement("根節點名稱");

      1.4.4.5 元素對象Element

      //指的是XML文檔中的單個節點. //常用方法: //1. 獲取節點名稱 String getName(); //2. 獲取節點內容 String getText(); //3. 設置節點內容 String setText(); //4. 根據子節點的名稱 , 獲取匹配名稱的第一個子節點對象. Element element(String 子節點名稱); //5. 獲取所有的子節點對象 List elements(); //6. 獲取節點的屬性值 String attributeValue(String 屬性名稱); //7. 獲取子節點的內容 String elementText(String 子節點名稱); //8. 添加子節點 Element addElement(String 子節點名稱); //9. 添加屬性 void addAttribute(String 屬性名,String 屬性值);

      1.4.4.6 XPATH解析

      1.4.4.6.1 路徑表達式

      通過路徑快速的查找一個或一組元素:

      / : 從根節點開始查找 // : 從發起查找的節點位置查找后代節點 . : 查找當前節點 … : 查找父節點 @ : 選擇屬性,屬性使用方式: [@屬性名=‘值’] [@屬性名>‘值’] [@屬性名<‘值’] [@屬性名!=‘值’]

      1.4.4.6.2 解析方法

      通過Node類的兩個方法, 來完成查找: (Node是 Document 與 Element 的父接口)。

      根據路徑表達式, 查找匹配的單個節點

      Element e = selectSingleNode("路徑表達式");

      根據路徑表達式, 查找匹配的多個節點

      List es = selectNodes("路徑表達式");

      1.4.4.6.3 解析步驟

      獲取到XML資源的輸入流

      //示例 String phone = "18313935565"; URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"); URLConnection conn = url.openConnection();//發起通信連接 InputStream is = conn.getInputStream();//獲取字節輸入流

      創建一個XML讀取對象

      SAXReader sr = new SAXReader();

      通過讀取對象 讀取XML數據,并返回文檔對象

      Document doc = sr.read(is); Node node = doc.selectSingleNode("http://company"); System.out.println("運營商:"+node.getText());

      資源釋放

      XML 與 JSON 相關知識點整理

      is.close();

      1.5 Java生成XML

      1.5.1 通過DocumentHelper生成

      1.5.1.1 生成步驟

      通過文檔幫助器 (DocumentHelper) , 創建空的文檔對象

      Document doc = DocumentHelper.createDocument();

      通過文檔幫助器 (DocumentHelper) , 創建空的文檔對象

      Element root = doc.addElement("根節點名稱");

      通過根節點對象root , 豐富我們的子節點

      Element e = root.addElement("元素名稱")

      創建一個文件輸出流 ,用于存儲XML文件

      FileOutputStream fos = new FileOutputStream("要存儲的位置");

      將文件輸出流, 轉換為XML文檔輸出流

      XMLWriter xw = new XMLWriter(fos);

      寫出文檔

      xw.write(doc);

      釋放資源

      xw.close();

      1.5.2 通過XStream生成

      快速的將Java中的對象, 轉換為XML字符串。

      創建XStream對象

      XStream x = new XStream();

      修改目標類生成的節點名稱 (默認節點名稱為 包名.類名)

      x.alias("節點名稱",類名.class);

      傳入對象 , 生成XML字符串

      String xml字符串 = x.toXML("對象");

      2. XML和HTML的區別

      xml標簽都是自定義的,html標簽是預定義;

      xml的語法嚴格,html語法松散;

      xml是存儲數據的,html是展示數據。

      3. JSON

      JS對象簡譜 (JavaScript Object Notation, JSON), 是一種輕量級的數據交換格式。

      **一個對象, 由一個大括號表示。**括號中描述對象的屬性。通過鍵值對來描述對象的屬性 (可以理解為, 大括號中, 包含的是一個個的鍵值對) { "name":"xxx", "age":3, "friends":["xxx","xxx","xxx","xxx",{ "name":"xxx", "info":"xxx" }], "clothes":{ "name":"xxx", "length":1 } }

      3.1 JSON的格式特點

      鍵與值之間使用冒號連接;

      多個鍵值對之間使用逗號分隔;

      鍵值對的鍵應使用引號引住(通常Java解析時, 鍵不使用引號會報錯。而JS能正確解析);

      鍵值對的值, 可以是JS中的任意類型的數據。

      3.2 獲取JSON中的數據

      json對象.鍵名

      json對象[“鍵名”]

      數組對象[索引]

      3.3 Java與JSON

      3.3.1 Java與JSON的相互轉換

      格式化:將Java中的對象 快速的轉換為 JSON格式的字符串;

      解析:將JSON格式的字符串, 轉換為Java的對象。

      3.3.2 GSON(谷歌)

      3.3.2.1 格式化

      導入JAR包;

      將目標對象轉換成JSON格式的字符串。

      String json = new Gson().toJSON("要轉換的對象");

      3.3.2.2 解析

      導入JAR包;

      將JSON字符串轉換成Java對象。

      對象類型 對象名 = new Gson().fromJson(JSON字符串,對象類型.class);

      3.3.3 FastJSON(阿里巴巴)

      3.3.3.1 格式化

      導入JAR包;

      將目標對象轉換成JSON格式的字符串。

      String json=JSON.toJSONString(要轉換的對象);

      3.3.4.2 解析

      導入JAR包;

      將JSON字符串轉換成Java對象(兩種方法)。

      對象類型 對象名=JSON.parseObject(JSON字符串, 類型.class); //List<類型> list=JSON.parseArray(JSON字符串,類型.class);

      3.3.4 注意事項

      如果沒有合適的類匹配,可以用Map裝入。JSON中存儲的屬性可能會是一個數組,那么轉換成Map之后,他的值是個ArrayList類型的。

      JSON XML

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel中計算加權平均值時如何忽略空白?
      下一篇:GaussDB(DWS)計劃生成原理揭秘(一)
      相關文章
      久久人午夜亚洲精品无码区| 亚洲国产综合无码一区二区二三区| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲乱亚洲乱妇24p| 久久亚洲日韩看片无码| 亚洲毛片在线观看| 亚洲∧v久久久无码精品| 无码乱人伦一区二区亚洲| 亚洲AV日韩精品久久久久| 久久青青草原亚洲AV无码麻豆 | 亚洲av成人综合网| 亚洲自国产拍揄拍| 亚洲va久久久久| 亚洲精品国产高清在线观看| 亚洲精品中文字幕| 亚洲国产成人AV网站| 大胆亚洲人体视频| 亚洲一区精品伊人久久伊人| 国产精品亚洲视频| 国产亚洲av片在线观看16女人| 久久精品国产亚洲一区二区| 亚洲av色福利天堂| 亚洲精品中文字幕无乱码| 亚洲国产成人久久精品app| 亚洲成a人片在线不卡| 亚洲日韩AV一区二区三区中文 | 久久精品亚洲视频| 亚洲网址在线观看| 亚洲欧洲日本精品| 在线观看亚洲AV日韩AV| 亚洲精品无码一区二区| 亚洲色中文字幕在线播放| www亚洲精品久久久乳| 亚洲精品天堂成人片?V在线播放| 久久夜色精品国产亚洲av| 亚洲成在人线av| 亚洲福利视频网址| 亚洲色偷偷色噜噜狠狠99网| 免费观看亚洲人成网站| 亚洲中文字幕无码久久精品1 | 亚洲国产综合专区电影在线|