JavaWeb学习笔记(XML语言)
知識點總結(jié)于崔希凡+王澤(廣陵散)的JavaWeb視頻教程,侵權(quán)請聯(lián)系刪除。
XML
- XML
- 簡介
- XML的應(yīng)用
- XML常見應(yīng)用
- XML的語法規(guī)則
- 文檔聲明
- 元素(標(biāo)簽)定義
- 屬性定義
- 注釋
- 特殊字符
- CDATA區(qū)
- 處理指令
- 小結(jié)
- XML約束
- 概述
- DTD約束
- 使用DTD定義元素
- 使用DTD定義屬性
- 定義實體
- Schema約束
- XMLSchema文檔基本結(jié)構(gòu)
- XMLSchema簡易元素和復(fù)雜元素
- XMLSchema復(fù)雜元素指示器
- 約束屬性
- 對XML Schema的引用
- 名稱空間的概念
- 使用名稱空間引入Schema
- 示例
XML
簡介
XML(eXtensible Markup Language): 指可擴(kuò)展標(biāo)記語言
- 標(biāo)記型語言:html是標(biāo)記型語言,XML也是使用標(biāo)簽來操作的
- 可擴(kuò)展:html里面的標(biāo)簽是固定,每個標(biāo)簽都有特定的含義例如:<h1> <br/> <hr/>,但是XML標(biāo)簽可以自己定義,可以寫中文的標(biāo)簽 例如:<person></person>、<貓></貓>
XML標(biāo)簽沒有被預(yù)定義,需要用戶自行定義標(biāo)簽。 - XML的用途:XML 被設(shè)計用來傳輸和存儲數(shù)據(jù)(XML也可顯示數(shù)據(jù),但不是主要功能)。
- XML技術(shù)是W3C組織(World Wide Web Consortium萬維網(wǎng)聯(lián)盟)發(fā)布的,目前遵循的是W3C組織于2000年發(fā)布的XML1.0規(guī)范。
xml有兩個版本:1.0 1.1
使用都是1.0版本,(1.1版本不能向下兼容) - XML被廣泛認(rèn)為是繼Java之后在Internet上最激動人心的新技術(shù)。
XML的應(yīng)用
- XML語言出現(xiàn)的根本目的在于描述向上圖那種有關(guān)系的數(shù)據(jù)。
- XML是一種通用的數(shù)據(jù)交換格式。
- 在XML語言中,它允許用戶自定義標(biāo)簽。一個標(biāo)簽用于描述一段數(shù)據(jù);一個標(biāo)簽可分為開始標(biāo)簽和結(jié)束標(biāo)簽,在起始標(biāo)簽之間,又可以使用其它標(biāo)簽描述其它數(shù)據(jù),以此來實現(xiàn)數(shù)據(jù)關(guān)系的描述。
- XML中的數(shù)據(jù)必須通過軟件程序來解析執(zhí)行或顯示,如IE;這樣的解析程序稱之為Parser(解析器)。
XML常見應(yīng)用
- 用于描述qq直接傳輸數(shù)據(jù),使用xm格式進(jìn)行描述,具有可讀性和可維護(hù)性
- XML技術(shù)除用于保存有關(guān)系的數(shù)據(jù)之外,它還經(jīng)常用作軟件配置文件,以描述程序模塊之間的關(guān)系。(如Struts、Spring和Hibernate都是基于XML作為配置文件的)
- 在一個軟件系統(tǒng)中,通過XML配置文件可以提高系統(tǒng)的靈活性。即程序的行為是通過XML文件來配置的,而不是硬編碼。
XML的語法規(guī)則
文檔聲明
- 在編寫XML文檔時,需要先使用文檔聲明來聲明XML文檔,且必須出現(xiàn)在文檔的第一行。(寫了文檔聲明之后,表示寫xml文件的內(nèi)容)
最簡單的語法:<?xml version=“1.0”?> - 用encoding屬性說明文檔所使用的字符編碼。保存在磁盤上的文件編碼要與聲明的編碼一致,否則會出現(xiàn)亂碼。
因為碼表中存儲的相同字符的位置不一樣,如果按照GBK碼表存儲字符,假定“你好”位置分別在1和2,而通過UTF-8打開,因為UTF-8碼表中1 2位置上的字符是其它字符,所以會出現(xiàn)亂碼。
字符編碼強(qiáng)行將每一個字符對應(yīng)一個十進(jìn)制數(shù)字,再將十進(jìn)制數(shù)字轉(zhuǎn)換成計算機(jī)理解的二進(jìn)制,而計算機(jī)讀到這些1和0之后就會顯示出對應(yīng)的文字或符號。
如:<?xml version=“1.0” encoding=“GB2312”?> - 用standalone屬性說明文檔是否獨立,即是否依賴其他文檔。
如:<?xml version=“1.0” standalone=“yes”?>
元素(標(biāo)簽)定義
-
XML元素指XML文件中出現(xiàn)的標(biāo)簽。一個標(biāo)簽分為起始和結(jié)束標(biāo)簽(不能省略)。一個標(biāo)簽有如下幾種書寫形式:
1.包含標(biāo)簽主體:<mytag>some content</mytag>
2.不含標(biāo)簽主體:<mytag/> -
一個標(biāo)簽中可以嵌套若干子標(biāo)簽,但所有標(biāo)簽必須合理的嵌套,不允許有交叉嵌套。
錯誤示例:<mytag1><mytag2></mytag1></mytag2> -
一個XML文檔必須有且僅有一個根標(biāo)簽,其他標(biāo)簽都是這個根標(biāo)簽的子標(biāo)簽或?qū)O標(biāo)簽。
-
對于XML標(biāo)簽中出現(xiàn)的所有空格和換行,XML解析程序都會當(dāng)作標(biāo)簽內(nèi)容進(jìn)行處理。例如下面兩段內(nèi)容的意義是不一樣的:
- <網(wǎng)址>www.itcast.cn</網(wǎng)址>
- <網(wǎng)址>
????www.itcast.cn
</網(wǎng)址>
由于在XML中,空格和換行都作為原始內(nèi)容被處理,所以,在編寫XML文件時,使用換行和縮進(jìn)等方式來讓原文件中的內(nèi)容清晰可讀的“良好”書寫習(xí)慣可能要被迫改變。
-
一個XML元素可以包含字母、數(shù)字以及其它一些可見字符,但必須遵守下面的一些規(guī)范:
- 區(qū)分大小寫,例如,<P>和<p>是兩個不同的標(biāo)記
- 不能以數(shù)字或"_" (下劃線)開頭
- 不能以xml(或XML、或Xml 等)開頭
- 不能包含空格
- 名稱中間不能包含冒號(:)
屬性定義
-
一個元素可以有多個屬性,每個屬性都有它自己的名稱和取值,例如:<mytag name=“value” …/>
-
屬性值一定要用引號(單引號或雙引號)引起來
-
屬性名稱的命名規(guī)范與元素的命名規(guī)范相同
-
元素中的屬性是不允許重復(fù)的
-
在XML技術(shù)中,標(biāo)簽屬性所代表的信息也可以被改成用子元素的形式來描述,例如:
<mytag><name><firstName/><lastName/></name></mytag>
注釋
- XML中的注釋語法為:<!–這是注釋–>
- 注意:
1.XML聲明之前不能有注釋(即第一行)
2.注釋不能嵌套,例如:
特殊字符
- 在xml文檔中有些字符是特殊的,不能使用它們作為文本數(shù)據(jù)。例如:不能使用“<”或“>”等字符作為文本數(shù)據(jù),所以需要使用轉(zhuǎn)義字符來表示。
例如在xml中直接輸入 a<b ,結(jié)果不能正常顯示,因為把<當(dāng)做了標(biāo)簽
如果就想要顯示,需要對特殊字符 < 進(jìn)行轉(zhuǎn)義:a < b
CDATA區(qū)
當(dāng)大量的轉(zhuǎn)義字符出現(xiàn)在xml文檔中時,會使xml文檔的可讀性大幅度降低。這時如果使用CDATA段就會好一些。
在CDATA段中出現(xiàn)的“<”、“>”、“””、“’”、“&”,都無需使用轉(zhuǎn)義字符。這可以提高xml文檔的可讀性。
- 書寫格式(紅色部分):
<a><![CDATA[ <a> ]]></a>
處理指令
處理指令,簡稱PI(Processing instruction)。處理指令用來指揮解析器如何解析XML文檔內(nèi)容。
- 例如,在XML文檔中可以使用xml-stylesheet指令,通知XML解析器,應(yīng)用css文件顯示xml文檔內(nèi)容:<?xml-stylesheet type="text/css" href="a.css"?>
處理指令以“<?”開頭,以“?>”結(jié)束,這一點與xml文檔聲明相同。
CSS:
gj1 {font-size: 200px; color: red;}
gj2 {font-size: 100px; color: green;}
gj3 {font-size: 10px;}
gj4 {font-size: 50px; color: blue;}
XML:
<?xml version="1.0" encoding="gbk"?> <?xml-stylesheet type="text/css" href="a.css" ?><gjm>
?<gj1>中國</gj1>
<gj2>美國</gj2>
<gj3>日本</gj3>
<gj4>英國</gj4>
</gjm>
小結(jié)
- 所有 XML 元素都須有關(guān)閉標(biāo)簽
- XML 標(biāo)簽對大小寫敏感
- XML 必須正確地嵌套順序
- XML 文檔必須有根元素(只有一個)
- XML 的屬性值須加引號
- 特殊字符必須轉(zhuǎn)義 — CDATA
- XML 中的空格、回車換行會解析時被保留
XML約束
概述
在XML技術(shù)里,可以編寫一個文檔來約束一個XML文檔的書寫規(guī)范(與xml語法無關(guān)),這稱之為XML約束。
- 為什么需要XML約束?
因為xml文檔是可以自定義元素的,這會讓使用xml文檔的應(yīng)用程序無法知道xml文檔的真實結(jié)構(gòu)。通常應(yīng)用程序都會要求xml文件的結(jié)構(gòu)是固定的,以滿足自己的需求,這就說明,不同的應(yīng)用程序要求自己的xml文檔必須符合一定的要求。 - 兩個概念:
格式良好的XML:遵循XML語法的XML
有效的XML:遵循約束文檔的XML
總之:約束文檔定義了在XML中允許出現(xiàn)的元素名稱、屬性及元素出現(xiàn)的順序等等。 - 常用的約束技術(shù):
XML DTD
XML Schema
DTD約束
DTD(Document Type Definition),全稱為文檔類型定義。dtd是平面式文檔,dtd文件不是xml文檔,通常擴(kuò)展名為“.dtd”。它是最早的xml約束。
什么是DTD約束?
DTD(Document Type Definition),文檔類型定義,用來約束XML文檔。例如要求xml文檔的根元素必須是,在元素下可以包含0~n個元素,每個元素必須有一個number屬性,而且還要有三個子元素,分別<name>、<age>、<sex>,這三個子元素的內(nèi)容必須為文本內(nèi)容,而不能是子元素。
創(chuàng)建步驟:
復(fù)雜元素:有子元素的元素
<!ELEMENT 元素名稱 (子元素)>
簡單元素:沒有子元素
<!ELEMENT 元素名稱 (#PCDATA)>
注意:元素名稱和括號之間存在空格,不然格式錯誤
注意:如果我們打開xml文件是用瀏覽器打開的,由于瀏覽器只負(fù)責(zé)校驗xml的語法,不負(fù)責(zé)校驗約束,所以不會起到約束作用。
如果想要校驗xml的約束,需要使用工具(myeclipse工具、Idea)。
DTD的三種引入方式:
DTD約束即可以作為一個單獨的文件編寫,也可以在XML文件內(nèi)編寫。
<!DOCTYPE 根元素名稱 SYSTEM “dtd路徑”>
<!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<!DOCTYPE 根元素 PUBLIC “DTD名稱” “DTD文檔的URL”>
框架 struts2 使用配置文件就是外部的dtd文件
示例:<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN” “http://struts.apache.org/dtds/struts-2.0.dtd”>
使用DTD定義元素
-
在DTD文檔中使用ELEMENT關(guān)鍵字來聲明一個XML元素。
-
語法:<!ELEMENT 元素名稱 使用規(guī)則>
規(guī)則:
(#PCDATA):指示元素的主體內(nèi)容只能是普通的文本.(Parsed Character Data)
EMPTY:用于指示元素的主體為空。比如<br/>
ANY:用于指示元素的主體內(nèi)容為任意類型(可以為空)。
(子元素):指示元素中包含的子元素 -
定義子元素及描述它們的關(guān)系:
- 如果子元素用逗號分開,說明必須按照聲明順序去編寫XML文檔。
如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL) 標(biāo)簽要從TITLE開始到EMAIL結(jié)束的順序書寫 - 如果子元素用“|”分開,說明任選其一。
如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)(只能在三個標(biāo)簽中選擇一個) - 用+、*、?來表示元素出現(xiàn)的次數(shù)
+:表示至少出現(xiàn)一次,一次或多次
*:表示可有可無,零次、一次或多次
?:表示可以有也可以無,有的話只能有一次。零次或一次
- 如果子元素用逗號分開,說明必須按照聲明順序去編寫XML文檔。
圖例:
使用DTD定義屬性
- 屬性的定義格式:
- 示例:
- 屬性值類型:
CDATA:表示屬性的取值為普通的文本字符串
ENUMERATED (DTD沒有此關(guān)鍵字):表示枚舉,只能從枚舉列表中任選其一,如(雞肉|牛肉|豬肉|魚肉)
ID:表示屬性的取值不能重復(fù),屬性的值只能由字母,下劃線開始,不能出現(xiàn)空白字符
如果把student元素的number屬性設(shè)定為ID類型,那么每個student元素的number屬性值必須是唯一的,并且ID類型的屬性值不能以數(shù)字開頭。 - 屬性約束設(shè)置說明:
#REQUIRED:表示該屬性必須出現(xiàn)
#IMPLIED:表示該屬性可有可無
#FIXED:表示屬性的取值為一個固定值。語法:#FIXED “固定值”
直接值(直接輸入一個值):表示屬性的取值為該默認(rèn)值
示例:
<!ATTLIST 頁面作者 姓名 CDATA #IMPLIED 年齡 CDATA #IMPLIED 聯(lián)系信息 CDATA #REQUIRED 網(wǎng)站職務(wù) CDATA #FIXED "頁面作者" 個人愛好 CDATA "上網(wǎng)">根元素為 頁面作者 ,姓名元素和年齡元素的文本內(nèi)容可有可無,聯(lián)系信息元素的文本內(nèi)容必須出現(xiàn)。
定義實體
實體用于為一段內(nèi)容創(chuàng)建一個別名,以后在XML文檔中就可以使用別名引用這段內(nèi)容了。相當(dāng)于在Java中的用final定義一個常量值。
- 語法:<!ENTITY 實體名稱 “實體內(nèi)容”>
- 概念:在DTD中定義,在XML中使用
- 引用方式(注意是在XML中使用):&實體名稱;
Schema約束
XML Schema 也是一種用于定義和描述 XML 文檔結(jié)構(gòu)與內(nèi)容的模式語言,其出現(xiàn)是為了克服 DTD 的局限性。
概念:
- XML Schema 文件自身就是一個XML文件,但它的擴(kuò)展名通常為.xsd
- 和XML文件一樣,一個XML Schema文檔也必須有一個根結(jié)點,但這個根結(jié)點的名稱為Schema
- 應(yīng)用schema約束,開發(fā)xml過程
- 編寫了一個XML Schema約束文檔后,通常需要把這個文件中聲明的元素綁定到一個URI地址上,這個URI地址叫namespace名稱空間,以后XML文件就可以通過這個URI(即名稱空間)引用綁定指定名稱空間的元素
XML Schema的特點:
- XML Schema符合XML語法結(jié)構(gòu)。
- DOM、SAX等XML API很容易解析出XML Schema文檔中的內(nèi)容。
- XML Schema對名稱空間支持得非常好。
- XML Schema比XML DTD支持更多的數(shù)據(jù)類型,并支持用戶自定義新的數(shù)據(jù)類型。
- XML Schema定義約束的能力非常強(qiáng)大,可以對XML實例文檔作出細(xì)致的語義限制。
- XML Schema不能像DTD一樣定義實體,比DTD更復(fù)雜,但Xml Schema現(xiàn)在已是w3c組織的標(biāo)準(zhǔn),它正逐步取代DTD。
Schema和DTD區(qū)別:
XML從SGML中繼承了DTD,并用它來定義內(nèi)容的模型,驗證和組織元素。同時,它也有很多局限:
- DTD不遵守XML語法;
- DTD不可擴(kuò)展;
- DTD不支持命名空間的應(yīng)用;
- DTD沒有提供強(qiáng)大的數(shù)據(jù)類型支持,只能表示很簡單的數(shù)據(jù)類型。
Schema完全克服了這些弱點,使得基于Web的應(yīng)用系統(tǒng)交換XML數(shù)據(jù)更為容易。下面是它所展現(xiàn)的一些新特性:
- Schema完全基于XML語法,不需要再學(xué)習(xí)特殊的語法;
- Schema能用處理XML文檔的工具處理,而不需要特殊的工具;
- Schema大大擴(kuò)充了數(shù)據(jù)類型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等;
- Schema支持原型,也就是元素的繼承。如:我們定義了一個“聯(lián)系人”數(shù)據(jù)類型,然后可以根據(jù)它產(chǎn)生“朋友聯(lián)系人”和“客戶聯(lián)系”兩種數(shù)據(jù)類型;
- Schema支持屬性組。我們一般聲明一些公共屬性,然后可以應(yīng)用于所有的元素,屬性組允許把元素、屬性關(guān)系放于外部定義、組合;
- 開放性。原來的DTD只能有一個DTD應(yīng)用于一個XML文檔,現(xiàn)在可以有多個Schema運用于一個XML文檔。
XMLSchema文檔基本結(jié)構(gòu)
- 在W3C XML schema規(guī)范中規(guī)定:所有的Schema文檔都使用 <schema>作為其根元素
- <schema>元素可以包含一些屬性。一個XML schema聲明看起來經(jīng)常以如下的形式出現(xiàn):
<schema xmlns=“http://www.w3.org/2001/XMLSchema”
targetNamespace=“http://www.itcast.cn/20140213”
elementFormDefault=“qualified”>
xmlns="http://www.w3.org/2001/XMLSchema"代表當(dāng)前xml文件是一個約束文件;
targetNamespace="http://www.itcast.cn/20140213"代表如果要使用schema約束文件,直接通過這個地址引入約束文件;
elementFormDefault="qualified"代表在xml中,所有引用xsd的全局的元素都必須加上命名空間的前綴
XMLSchema簡易元素和復(fù)雜元素
- 簡易元素:指那些僅包含文本的元素。它不會包含任何其他的元素或?qū)傩浴?br /> <element name=“xxx” type=“string"/>
- 復(fù)雜元素:復(fù)雜類型元素是包含子元素或者屬性的元素
使用<complexType>:表示復(fù)雜類型 - <sequence>:表示有順序
示例:XML文件有一個根元素person,根元素中有一個元素person,其中包含兩個子類元素to和from
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/1111" elementFormDefault="qualified"><element name="person"><complexType><sequence><element name="man"><complexType><sequence><element name="name" type="string"></element><element name="age" type="string"></element></sequence></complexType></element></sequence></complexType></element> </schema>XMLSchema復(fù)雜元素指示器
All:表示只能出現(xiàn)一次
Choice: 只能出現(xiàn)其中的一個
Sequence:元素按照順序出現(xiàn)
maxOccurs=“unbounded” 表示出現(xiàn)次數(shù)沒限制
定義屬性(必須是復(fù)雜元素):<attribute name=“p1” type=“string” use=“required”></attribute>
<any></any>:表示任意元素
約束屬性
- 寫在復(fù)雜元素里面
- 寫在</complexType>之前
例如:
<attribute name=“id1” type=“int” use=“required”>
代表該元素名稱為id1,屬性類型為int,且必須出現(xiàn)
對XML Schema的引用
- Schema和被約束的xml都是xml文檔,如何區(qū)分哪個是被約束的文檔?
使用名稱空間區(qū)分被約束文檔(使用w3c名稱空間)
xmlns=“http://www.w3.org/2001/XMLSchema-instance” 代表當(dāng)前的文檔是一個實例文檔(被約束的文檔) - 引用自定義的schema,使用自定義的名稱空間
由于一個標(biāo)簽上不能出現(xiàn)兩個同名的屬性,所以需要給名稱空間起一個別名xsi。xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
引用本地xsd文件存放位置,使用schemaLocation:代表的是Schema文檔存放的路徑
名稱空間的概念
- 在XML Schema中,每個約束模式文檔都可以被賦以一個唯一的名稱空間,名稱空間用一個唯一的URI(Uniform Resource Identifier,統(tǒng)一資源標(biāo)識符)表示。 在Xml文件中書寫標(biāo)簽時,可以通過名稱空間聲明(xmlns),來聲明當(dāng)前編寫的標(biāo)簽來自哪個Schema約束文檔。如:
<itcast:書架 xmlns:itcast=“http://www.itcast.cn”>
<itcast:書>……</itcast:書>
</itcast:書架>
此處使用itcast來指向聲明的名稱,以便于后面對名稱空間的引用。 - 注意:名稱空間的名字語法容易讓人混淆,盡管以 http:// 開始,那個 URL 并不指向一個包含模式定義的文件。事實上,這個 URL:http://www.itcast.cn根本沒有指向任何文件,只是一個分配的名字。
使用名稱空間引入Schema
- 為了在一個XML文檔中聲明它所遵循的Schema文件的具體位置,通常需要在Xml文檔中的根結(jié)點中使用schemaLocation屬性來指定,例如:
<itcast:書架 xmlns:itcast=“http://www.itcast.cn”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.itcast.cn book.xsd"> - schemaLocation此屬性有兩個值。第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置,兩者之間用空格分隔。
- 注意,在使用schemaLocation屬性時,也需要指定該屬性來自哪里。
示例:
company.xml
company.xsd
department.xsd
示例
為students.xml編寫DTD:
<!ELEMENT students (student+)> <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ATTLIST student number CDATA #REQUIRED>為students.xml編寫schema:
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="students" type="studentsType"/><xsd:complexType name="studentsType"><xsd:sequence><xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:complexType name="studentType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="age"><xsd:simpleType><xsd:restriction base="xsd:integer"><xsd:maxInclusive value="100"/><xsd:minInclusive value="0"/></xsd:restriction></xsd:simpleType></xsd:element><xsd:element name="sex"><xsd:simpleType><xsd:restriction base="xsd:string"><xsd:enumeration value="男"/><xsd:enumeration value="女"/></xsd:restriction></xsd:simpleType></xsd:element></xsd:sequence><xsd:attribute name="number" type="xsd:string"/></xsd:complexType> </xsd:schema>參照Schema編寫XML文檔:
我們參照上面的Schema文檔編寫一個studens.xml文件
總結(jié)
以上是生活随笔為你收集整理的JavaWeb学习笔记(XML语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能语音将成下一代人机交互新入口
- 下一篇: Asp.Net MVC学习记录之“一个