XML全稱爲Extensible Markup Language,意思是可擴展的標記語言。java
XML的做用是存放數據,配置文件spring
文檔聲明格式:sql
<?version="1.0" encoding="UTF-8"?>dom
文檔聲明必須爲<?xml開頭,以?>結尾ui
文檔聲明必須從文檔的0行0列位置開始編碼
文檔聲明只有兩個屬性spa
version:指定xml文檔版本,必須屬性,由於咱們不會選擇1.1,只會選擇1.0code
encoding:指定當前文檔的編碼,可選屬性,經常使用值是UTF-8orm
元素:elementxml
元素是xml文檔中最重要的組成部分
普通元素的結構開始標籤,元素體,結束標籤組成.
<hello>你好</hello>
元素體能夠是元素,也能夠是文本
<a><b>你好</b></a>
空元素只有開始標籤,但元素必須本身閉合,<c/>
元素命名:區分大小寫,不能使用空格,不能使用冒號,
必須只有一個跟元素
屬性:attribute
屬性是元素的一部分,它必須出如今元素的開始標籤中
屬性的定義格式,屬性名=屬性值,其中屬性值必須使用單引或雙引
一個元素能夠有n個屬性,但一個元素不能出現同名屬性
屬性名不能使用空格,冒號等特殊字符,必須以字母開頭
xml註釋
xml的註釋,<!-- -->
轉義字符
CDATA
<![CDATA[ <bean id="xx" className="xx"> <property name="xx" value="xx" > 1 < 3 > & " ' </property> </bean> ]]>
在xml中,能夠編寫一個文檔來約束一個xml文檔的書寫規範,這稱之爲xml約束
常見都有DTD,Schema
經過約束文檔,能夠編寫出具備固定格式,規定格式的xml文檔
DTD
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id ID #REQUIRED
className CDATA #REQUIRED
type CDATA #IMPLIED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>
XML
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans SYSTEM "bean.dtd"> <beans> <bean id="b001" className=""> <property name="" value=""></property> <property name="" value=""></property> <property name="" value=""></property> <property name="" value=""></property> </bean> <bean id="b002" className=""></bean> <bean id="b003" className=""></bean> <bean id="b004" className=""></bean> <import resource=""></import> <import resource=""></import> <import resource=""></import> <import resource=""></import> </beans>
元素聲明
Schema是新的XML文檔約束;
Schema要比DTD強大不少,是DTD 替代者;
Schema自己也是XML文檔,但Schema文檔的擴展名爲xsd,而不是xml。
Schema 功能更強大,數據類型更完善
Schema 支持名稱空間
<?xml version="1.0" encoding="UTF-8"?> <!-- 模擬spring規範,若是開發人員須要在xml使用當前Schema約束,必須包括指定命名空間。 格式以下: <beans xmlns="http://www.itcast.cn/bean" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd" > --> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/bean" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.itcast.cn/bean" elementFormDefault="qualified"> <!-- 聲明根標籤 --> <element name="beans"> <complexType> <choice minOccurs="0" maxOccurs="unbounded"> <element name="bean"> <complexType> <sequence minOccurs="0" maxOccurs="unbounded"> <element name="property"> <complexType> <attribute name="name" use="required"></attribute> <attribute name="value" use="required"></attribute> </complexType> </element> </sequence> <attribute name="id" use="required"></attribute> <attribute name="className" use="required"></attribute> </complexType> </element> <element name="import"> <complexType> <attribute name="resource" use="required"></attribute> </complexType> </element> </choice> </complexType> </element> </schema>
Schema命名空間
若是一個XML文檔中使用多個Schema文件,而這些Schema文件中定義了相同名稱的元素時就會出現名字衝突。這就像一個Java文件中使用了import java.util.*和import java.sql.*時,在使用Date類時,那麼就不明確Date是哪一個包下的Date了
總之名稱空間就是用來處理元素和屬性的名稱衝突問題,與Java中的包是同一用途。若是每一個元素和屬性都有本身的名稱空間,那麼就不會出現名字衝突問題,就像是每一個類都有本身所在的包同樣,那麼類名就不會出現衝突
聲明命名空間
默認命名空間:<xxx xmlns=」」> ,使用<標籤>
顯式命名空間:<xxx xmlns:別名=」」> , 使用<別名:標籤>
1.一個xml文檔中,只能出現一次「默認引用」
<beans xmlns="名稱"
2.一個xml文檔中,能夠出現屢次「顯示引用」
<beans xmlns:a="名稱a"
xmlns:b="名稱b"
3.全部引用(默認+顯示),都必須肯定xsd文檔位置
<beans xmlns="默認名稱"
xmlns:a="名稱a"
xmlns:b="名稱b"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="默認名稱 默認位置
名稱a a位置
名稱b b位置"
Schema基本語法
聲明根標籤
1. <element> 聲明元素(標籤)
2. 每個元素必須肯定類型:
complexType 複雜類型
simpleType 簡單類型,通常不用,大部分都是複雜類型
3. 須要繼續明確子標籤出差順序
<choice> 選擇, ()
<sequence> 順序 ,
<all> 任意
minOccurs 最少出現次數
maxOccurs 最大出現次數,unbounded 不限制(沒有邊)
4.<attribute>用於給元素聲明屬性的
use 設置屬性使用, optional可選、required必選
<element name="beans"> <complexType> <choice minOccurs="0" maxOccurs="unbounded"> <element name="bean"> <complexType> <sequence minOccurs="0" maxOccurs="unbounded"> <element name="property"> <complexType> <attribute name="name" use="optional"></attribute> <attribute name="value" use="required"></attribute> </complexType> </element> </sequence> <attribute name="id" use="required"></attribute> <attribute name="className" use="required"></attribute> </complexType> </element> <element name="import"> <complexType> <attribute name="resource" use="required"></attribute> </complexType> </element> </choice> </complexType> </element>
a) 優勢:元素與元素之間保留結構關係,故能夠進行增刪改查操做。
b) 缺點:XML文檔過大,可能出現內存溢出顯現。
2.SAX:是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。並以事件驅動的方式進行具體解析,每執行一行,都將觸發對應的事件。(瞭解)
a) 優勢:處理速度快,能夠處理大文件
b) 缺點:只能讀,逐行後將釋放資源。
9.dom解析原理
xml DOM將整個xml文檔加載到內存,生成一個DOM樹,並得到一個Document對象,經過document對象就能夠進行DOM操做
a) read(…) 加載執行xml文檔
a) getRootElement() 得到根元素
a) elements(…) 得到指定名稱的全部子元素。能夠不指定名稱
b) element(…) 得到指定名稱第一個子元素。能夠不指定名稱
c) getName() 得到當前元素的元素名
d) attributeValue(…) 得到指定屬性名的屬性值
e) elementText(…) 得到指定名稱子元素的文本值
f) getText() 得到當前元素的文本內容
import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; public class Dom4jDemo_01 { @Test public void demo01() throws DocumentException{ //1 核心類 SAXReader saxReader = new SAXReader(); //2 得到Document(整個xml) Document document = saxReader.read("beans.xml"); //3 得到根元素 beans Element rootElement = document.getRootElement(); //4 全部子元素 bean List<Element> allBeanElement = rootElement.elements("bean"); for (Element beanEle : allBeanElement) { //4.1 bean屬性 String id = beanEle.attributeValue("id"); String className = beanEle.attributeValue("className"); System.out.println("bean屬性:" + id + " , " + className); //5 元素property List<Element> allPropElement = beanEle.elements("property"); for (Element propEle : allPropElement) { String name = propEle.attributeValue("name"); String value = propEle.attributeValue("value"); System.out.println("property屬性:" + name + " , " + value); } System.out.println(""); } } }
被解析的xml文檔
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="beanId01" className="com.learn.domain.User"> <property name="uid" value="u001"></property> <property name="username" value="jack"></property> </bean> <bean id="beanId02" className="com.learn.domain.Book"> <property name="bid" value="b001"></property> <property name="title" value="標題"></property> </bean> </beans>