XML 與 JSON 相關知識點整理
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個屬性, 每一個屬性是一個鍵值對! 屬性名不允許重復 , 鍵與值之間使用等號連接, 多個屬性之間使用空格分割。屬性值必須被引號引住。
注釋
注釋不能寫在文檔文檔聲明前,注釋不能嵌套注釋。
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
1.4.4.6 XPATH解析
1.4.4.6.1 路徑表達式
通過路徑快速的查找一個或一組元素:
/ : 從根節點開始查找 // : 從發起查找的節點位置查找后代節點 . : 查找當前節點 … : 查找父節點 @ : 選擇屬性,屬性使用方式: [@屬性名=‘值’] [@屬性名>‘值’] [@屬性名<‘值’] [@屬性名!=‘值’]
1.4.4.6.2 解析方法
通過Node類的兩個方法, 來完成查找: (Node是 Document 與 Element 的父接口)。
根據路徑表達式, 查找匹配的單個節點
Element e = selectSingleNode("路徑表達式");
根據路徑表達式, 查找匹配的多個節點
List
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());
資源釋放
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小時內刪除侵權內容。