from:https://blog.csdn.net/gavin_john/article/details/51511180
1.XML歷史
gml(1969)->sgml(1985)->html(1993)->xml(1998)
- 1969 gml(通用標記語言),主要目的是要在不同的機器之間進行通信的數據規范
- 1985 sgml(標準通用標記語言)
- 1993 html(超文本標記語言,www網)
html語言本身是有一些缺陷的?
(1)不能自定義標簽?
(2)html本身缺少含義?
(3)html沒有真正的國際化有一個中間過渡語言,xhtml:?
html->xhtml->xml
- 1998 xml extensiable markup language 可擴展標記語言
2.為什么需要XML
1.需求1?
兩個程序間進行數據通信??
2.需求2?
給一臺服務器,做一個配置文件,當服務器程序啟動時,去讀取它應當監聽的端口號,還有連接數據庫的用戶名和密碼?
在XML語言中,它允許用戶自定義標簽。一個標簽用于描述一段數據;一個標簽可以分為開始標簽和結束標簽,在開始標簽和結束標簽之間,又可以使用其他標簽描述其他數據,以此來實現數據關系的描述。
3.XML常見應用
1.XML的出現解決了程序間數據傳輸的問題:?
比如QQ之間的數據傳送,用XML格式來傳送數據,具有良好的可讀性,可維護性
2.XML可以做配置文件?
XML文件做配置文件可以說非常普遍,比如我們的Tomcat服務器的server.xml,web.xml。再比如我們的structs中的structs-config.xml文件,和hibernate的hibernate.cfg.xml等等。
3.XML可以充當小型的數據庫?
XML文件可以做小型數據庫,也是不錯的選擇,我們程序中可能用到一些經常要人工配置的數據,如果放在數據庫中讀取不合適(因為這會增加維護數據庫的工作),則可以考慮直接用XML來做小型數據庫。這種方式直接讀取文件顯然要比讀數據庫快。比如msn中保存用戶聊天記錄就是用XML文件。
入門案例:用XML來記錄一個班級信息。
<?xml version="1.0" encoding="gb2312"?><class><stu id="001"><name>楊過</name> <sex>男</sex><age>20</age></stu> <stu id="002"><name>小龍女</name> <sex>女</sex><age>21</age></stu>
</class>
我們可以用瀏覽器打開:
那么我們的XML能不能像html那樣顯示在網頁上呢?也是可以的,它也可以用css來修飾,但我們不用,我們只需要使用XML來存儲數據。
在這個例子中,如果我們把第一行的編碼改為utf-8,再用瀏覽器打開會報錯,這是為什么呢?
因為xml文件的默認編碼是ANSI,即美國國家標準協會制定的編碼,它根據不同的國家和地區制定了不同的標準,那么在中國就是GB2312,所以我們用GB2312編碼不會出錯,而用UTF-8會報錯。
解決辦法就是將該XML文件更改為UTF-8的編碼模式即可。
4.XML語法
一個XML文件分為如下幾部分內容:?
1.文檔聲明?
2.元素?
3.屬性?
4.注釋?
5.CDATA區、特殊字符?
6.處理指令(processing instruction)
4.1.XML語法-文檔聲明
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
- XML聲明放在XML文檔的第一行?
XML聲明由以下幾個部分組成:
version –文檔符合XML1.0規范,我們學習1.0?
encoding –文檔字符編碼,比如”GB2312”或者”UTF-8”?
standalone –文檔定義是否獨立使用?
standalone=”no”為默認值。yes代表是獨立使用,而no代表不是獨立使用
4.2.XML語法-元素(或者叫標記、節點)
(1)每個XML文檔必須有且只有一個根元素
- 根元素是一個完全包括文檔中其他所有元素的元素
- 根元素的起始標記要放在所有其他元素的起始標記之前
- 跟元素的結束標記要放在所有其他元素的結束標記之后
(2)XML元素指的是XML文件中出現的標簽,一個標簽分為開始標簽和結束標簽,一個標簽有如下幾種書寫方式,例如
- 包含標簽體:
<a>www.sohu.com</a>
- 不含標簽體的:
<a></a>,簡寫為:<a/>
- (3)一個標簽中也可以嵌套若干子標簽。但所有標簽必須合理地嵌套,絕對不允許交叉嵌套,例如
<a>welcome to <b> www.sohu.com </a></b>
- 這種情況肯定是要報錯的。
(4)對于XML標簽中出現的所有空格和換行,XML解析程序都會當做標簽內容進行處理。例如下面兩段內容的意義是不一樣的。
<stu>xiaoming</stu>
- 和如下:
<stu>xiaoming
</stu>
(5)由于在XML中,空格和換行都作為原始內容被處理,所以,在編寫XML文件時,要特別注意。
(6)命名規范:一個XML元素可以包含字母、數字以及其它一些可見字符,但必須遵守以下規范:
- 區分大小寫,例如,元素P和元素p是兩個不同的元素
- 不能以數字或下劃線”_”開頭
- 元素內不能包含空格
- 名稱中間不能包含冒號(:)
- 可以使用中文,但一般不這么用
4.3.XML語法-屬性
<student id="100"><name>Tom</name>
</student>
(1)屬性值用雙引號(”)或單引號(’)分隔,如果屬性值中有單引號,則用雙引號分隔;如果有雙引號,則用單引號分隔。那么如果屬性值中既有單引號還有雙引號怎么辦?這種要使用實體(轉義字符,類似于html中的空格符),XML有5個預定義的實體字符,如下:
(2)一個元素可以有多個屬性,它的基本格式為:
<元素名 屬性名1="屬性值1" 屬性名2="屬性值2">
- (3)特定的屬性名稱在同一個元素標記中只能出現一次?
(4)屬性值不能包括<,>,&,如果一定要包含,也要使用實體
4.4.XML語法-注釋
XML的注釋類似于HTML中的注釋:
<!--這是一個注釋-->
- (1)注釋內容不要出現
--
?
(2)不要把注釋放在標記中間;?
(3)注釋不能嵌套?
(4)可以在除標記以外的任何地方放注釋
4.5.XML語法-CDATA節
假如有這么一個需求,需要通過XML文件傳遞一幅圖片,怎么做呢?其實我們看到的電腦上的所有文件,本質上都是字符串,不過它們都是特殊的二進制字符串。我們可以通過XML文件將一幅圖片的二進制字符串傳遞過去,然后再解析成一幅圖片。那么這個字符串就會包含大量的<,>,&或者“等一些特殊的不合法的字符。這時候解析引擎是會報錯的。
所以,有些內容可能不想讓解析引擎解析執行,而是當做原始內容處理,用于把整段文本解釋為純字符數據而不是標記。這就要用到CDATA節。
語法如下:
<![CDATA[......
]]>
CDATA節中可以輸入任意字符(除]]>
外),但是不能嵌套!
如下例,這種情況它不會報錯,而如果不包含在CDATA節中,就會報錯:
<stu id="001"><name>楊過</name> <sex>男</sex><age>20</age><intro><![CDATA[ad<<&$^#*k]]></intro>
</stu>
.6.XML語法-處理指令
處理指令,簡稱PI(processing instruction)。處理指令用來指示解析引擎如何解析XML文件,看下面一個例子:
比如我們也可以使用css樣式表來修飾XML文件,編寫my.css如下:
name{font-size:80px;font-weight:bold;color:red;
}sex{font-size:60px;font-weight:bold;color:blue;
}sex{font-size:40px;font-weight:bold;color:green;
}
我們在xml文件中使用處理指令引入這個css文件,如下:
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet href="my.css" type="text/css"?>
<class><stu id="001"><name>楊過</name> <sex>男</sex><age>20</age></stu> <stu id="002"><name>小龍女</name> <sex>女</sex><age>21</age></stu>
</class>
這時候我們再用瀏覽器打開這個xml文件,會發現瀏覽器解析出一個帶樣式的視圖,而不再是單純的目錄樹了:
但是XML的處理指令不要求掌握,因為用到的很少。
5.格式正規的XML文檔-小結
語法規范:
1.XML聲明語句?
2.必須有一個根元素?
3.標記大小寫敏感?
4.屬性值用引號?
5.標記成對?
6.空標記關閉?
7.元素正確嵌套
from:https://blog.csdn.net/qq_38254978/article/details/77870598
什么是xml文件格式
- 我們要給對方傳輸一段數據,數據內容是“too young,too simple,sometimes naive”,要將這段話按照屬性拆分為三個數據的話,就是,年齡too young,閱歷too simple,結果sometimes naive。我們都知道程序不像人,可以體會字面意思,并自動拆分出數據,因此,我們需要幫助程序做拆分,因此出現了各種各樣的數據格式以及拆分方式。比如,可以是這樣的數據為“too young,too simple,sometimes naive”然后按照逗號拆分,第一部分為年齡,第二部分為閱歷,第三部分為結果。
- 也可以是這樣的數據為“too_young*?too_simple*sometimes_naive”從數據開頭開始截取前面十一個字符,去掉號并把下劃線替換為空格作為第一部分,再截取接下來的十一個字符同樣去掉并替換下劃線為空格作為第二部分,最后把剩下的字符同樣去號體會空格作為第三部分。
- 這兩種方式都可以用來容納數據并能夠被解析,但是不直觀,通用性也不好,而且如果出現超過限定字數的字符串就容納不了,也可能出現數據本身就下劃線字符導致需要做轉義。基于這種情況,出現了xml這種數據格式, 上面的數據用XML表示的話可以是這樣
<person age="too young" experience="too simple" result="sometimes naive" />
也可以是這樣
<person><age value="too young" /><experience value="too simple" /><result value="sometimes naive" />
</person>
兩種方式都是xml,都很直觀,附帶了對數據的說明,并且具備通用的格式規范可以讓程序做解析。如果用json格式來表示的話,就是下面這樣看出來沒,其實數據都是一樣的,不同的只是數據的格式而已,同樣的數據,我用xml格式傳給你,你用xml格式解析出三個數據,用json格式傳給你,你就用json格式解析出三個數據,還可以我本地保存的是xml格式的數據,我自己先解析出三個數據,然后構造成json格式傳給你,你解析json格式,獲得三個數據,再自己構造成xml格式保存起來,說白了,不管是xml還是json,都只是包裝數據的不同格式而已,重要的是其中含有的數據,而不是包裝的格式。
XML文件創建格式
- 例:
<?xml version="1.0" encoding="utf-8" ?>
<root><part id = "01" name="選項一"><name>我是徐茅山</name><age>今年20歲</age><sex>男</sex></part><part id="02" name="選項二"><name>我是李逍遙</name><age>今年22歲</age><sex>男</sex></part>
</root>
- 開始的
xml文件的解析
- 這里只是簡單的提一下關于xml文件的解析,我使用的是比較流行的dom4j解析,[dom4j的文件下載地址](“https://dom4j.github.io/“)
- 實例:
package com.xinsi.qi.utils;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;public class Dom4jXml {public void test(){try {File inputFile = new File("F:\\J2EE學習資料\\demoLes03\\web\\WEB-INF\\test.xml");SAXReader reader = new SAXReader();Document document = reader.read(inputFile);System.out.println("Root element :"+document.getRootElement().getName());Element classElement = document.getRootElement();List<Node> nodes = document.selectNodes("/class/part[@id='02']");System.out.println("--------------------");for (Node node:nodes){System.out.println("標簽名=:"+node.getName());System.out.println("姓名:"+node.selectSingleNode("name").getText());System.out.println("年齡:"+node.selectSingleNode("age").getText());System.out.println("性別:"+node.selectSingleNode("sex").getText());}} catch (Exception e1) {e1.printStackTrace();}}}
- 首先創建一個xml文件,這里使用的xml文件就是上面的xml例子,使用dom4j,先創建文件,將文件引入。
File inputFile = new File("F:\\J2EE學習資料\\demoLes03\\web\\WEB-INF\\test.xml");
- 再創建dom4j的讀取文件類,來讀取xml文件
SAXReader reader = new SAXReader();
- Document是獲取根元素類,控制臺輸出時,如下
System.out.println("Root element :"+document.getRootElement().getName());
輸出Root element :root,該文件的根元素名稱為root
Element類是獲取根元素內的元素
- List nodes = document.selectNodes(“/class/part[@id=’02’]”) 這段代碼的意思是,定位到該元素屬性的位置,使用該方法還需要下載,jaxen.jar包,jaxen的下載地址
- @id=’02’的意思是定位到id為02的元素屬性,以遍歷的形式輸出出來。
for (Node node:nodes){
System.out.println("標簽名=:"+node.getName());
System.out.println("姓名:"+node.selectSingleNode("name").getText());
System.out.println("年齡:"+node.selectSingleNode("age").getText());
System.out.println("性別:"+node.selectSingleNode("sex").getText());
}
- 最終控制臺的輸出結果為:
標簽名=:part
姓名:我是李逍遙
年齡:今年22歲
性別:男