標籤:
今天內容
1.xml介紹
2.xml約束
3.xml解析
以上內容可以看懂,理解
4.貪吃蛇(補充)
------------------------------------------------
1.xml
xml:可擴充的標記語言.
xml作用:用於儲存與傳輸資料.
xml與html區別
?XML 不是 HTML 的替代。-----xml對應xlst 相當於css於html
?XML 和 HTML 為不同的目的而設計:
?XML 被設計為傳輸和儲存資料,其焦點是資料的內容。
?HTML 被設計用來顯示資料,其焦點是資料的外觀。
?HTML 旨在顯示資訊,而 XML 旨在傳輸資訊。
xml它的標記沒有預定義
2.關於xml書寫規範.它的組成部分
對於一個標準的xml它由以下幾部分組成
文檔聲明
元素
屬性
注釋
CDATA區 、特殊字元
處理指示(processing instruction)
1.文檔聲明
作用:用於聲明當前是一個xml文檔.
寫法:<?xml version="1.0" encoding="utf-8"?>
以上就是一個文檔聲明,它的作用是用來通知當前是一個xml文檔.
version是一個屬性 注意:在xml中它的文法要求比較嚴格 所有的屬性必須使用引號引起。
對於version的值 它只能取1.0
encoding:它代表的是當前xml文檔中的資訊的編碼. 常用的值有 gbk iso8859-1 gb18030 bg2312 utf-8
standalone:它的作用是描述當前文檔是否是一個獨立文檔。 這個屬性我們一般很少使用.
xml文檔也可以被瀏覽器直接解析.
關於文檔聲明的注意事項:
1.文檔本身編碼要與encoding的編碼一樣.
2.所有的屬性要使用引號引起.
3.關於全形空格問題.
2.元素--就是指我們的xml中的標籤.
1.xml中的元素(也就是標籤)必須有結束.(可以自關閉)
2.xml中的標籤可以嵌套,但是不能交叉嵌套。
3.一個標準的xml,有且只有一個根項目.*********************************
4.在xml中斷行符號換行都做為元素存在.
關於元素的命名規範
區分大小寫,例如,<P>和<p>是兩個不同的標記。
不能以數字或"_" (底線)開頭。
不能以xml(或XML、或Xml 等)開頭。
不能包含空格。
名稱中間不能包含冒號(:)。 --- Schema 它的名稱中使用:進行特殊定義.
-----------------------------
3.屬性
1.屬性值必須使用單引呈或雙引號引起。
2.盡量使用子項目來描述資訊,不使用屬性.
4.注釋
<!--
-->
與html一樣.
5.CDATA 地區.
CDATA地區中的內容會按原樣顯示,也就是說,不會被瀏覽器解析.
寫法:<![CDATA[
內容
]]>
在什麼時候使用:我們在文檔中一些資訊不需要瀏覽器解析,直接輸出就可以將資訊放置在CDATA地區。
如果在文檔中,只是有一些比較少的內容需要原樣輸出也可以使用專義字元。
6.指令(PI)
<?xml-stylesheet type="text/css" href="1.css"?>
xml總結:
所有 XML 元素都須有關閉標籤
XML 標籤對大小寫敏感
XML 必須正確地嵌套順序
XML 文檔必須有根項目
XML 的屬性值須加引號
特殊字元必須轉義
XML 中的空格會被保留
-----------------------------------------------------------------
xml約束
約束:xml文檔中可以寫不可以寫什麼.
xml約束有兩種
DTD------struts2架構,它就使用DTD做為約束.
SCHEMA-----後面 hibernate,spring中使用schema做為約束.
DTD簡單--比較老.
SCHEMA---比較複雜 現在開發中一般都使用SCHEMA來對xml進行約束.
DTD
快速入門:
1.dtd約束的檔案,尾碼名是dtd。
2.使用DOCTYPE匯入DTD
問題:怎樣可以判斷當前的dtd對xml檔案進行約束,並且約束成功.
1.在開發,我們可以直接使用IDE進行約束檢測。
2.可以直接使用js對xml文檔它是否遵循dtd約束進行檢查。
------------------------------------------
1.dtd與xml關聯的三種方式.
1.內部dtd
就是在xml檔案中直接寫入了dtd約束.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 書架 [
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價 (#PCDATA)>
]>
<書架>
<書>
<書名>Java就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>39.00元</售價>
</書>
...
</書架>
2.外部dtd
dtd檔案是一個單獨檔案。
1.本地dtd
<!DOCTYPE 文檔根結點 SYSTEM "DTD檔案的URL">
2.網路上的dtd
<!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD檔案的URL">
2.學習dtd文法
1.元素
怎樣聲明元素:
<!ELEMENT 元素的名稱 元素的內容類型>
<!ELEMENT books (book+)> 說明books下的book可以出現一次或多次。
元素的內容類型
1.PCDATA: 文本資訊
2.EMPTY:空
3.ANY: 可以是文本也可以是子項目.
關於元素書寫注意的地方.
1.<!ELEMENT books (book+)> 在books與(book+)之間一定要有空格.
2.對於(#PCDATA) 必須加括弧 如果是EMPTY ANY不用加
2.屬性
屬性定義格式
<!ATTLIST 元素名稱 屬性名稱 類型 約束>
屬性類型:CDATA 枚舉 ID
CDATA 代表是一個字串。
枚舉 (en1|en2|en3...) 代表屬性值必須從其中選擇一個.
ID 屬性值是唯一的.
屬性約束:
#REQUIRED 必須的.
#FIXED 綁定某個值.
#預設值
例子
<ATTLIST book lang CDATA #REQUIRED> lang屬性必有.
<ATTLIST book lang (en|zh) #REQUIRED> lang屬性必有,只能在zh與en之間取值.
<ATTLIST book lang CDATA #FIXED "en"> lang屬性已經綁定值,值只能是en。
<ATTLIST book lang ID #REQUIRED> lang屬性必須有,並且唯一.
<ATTLIST book lang CDATA "zh"> lang屬性如果沒有寫,預設值為zh,寫了就取寫入的屬性值.
3.實體
什麼是實體:
就是在我們xml或dtd檔案中有一些重複的資訊,我們可以將其聲明成執行個體,使用時,直接使用實體就可以。
實體分為兩種
1.引用實體---在xml文檔中使用
2.參數實體---在dtd文檔中使用.
1.引用實體:
文法格式:
<!ENTITY 實體名稱 “實體內容” >:直接轉變成實體內容
引用方式:
&實體名稱;
參數實體必須用於外部DTD檔案中,不能用於內部DTD
2.參數實體
文法格式化:
<!ENTITY % 實體名稱 “實體內容” >:直接轉變成實體內容
引用方式
%實體名稱;
----------------------------------------------------------------------------------
SCHEMA
它也是xml檔案一種約束方式.
DTD與SCHEMA 區別?
1.dtd文檔本身具有自己的文法規則。
SCHEMA本質就是一個xml檔案,它遵行xml文法.
2.DTD文檔對xml進行約束時,不能明確資料類型.
SCHEMA它可以精確的描述資料類型.
3.DTD檔案的尾碼是dtd。
SCHEMA檔案的尾碼是 XSD。
模型文檔---xsd
執行個體文檔---xml
重要概念:名稱空間
快速入門---目的:瞭解名稱空間
1.做一個xml檔案. books.xml
<books>
<book>
<name>java編程思想</name>
<price>99</price>
<author>tom</author>
</book>
</books>
2.定義一個schema約束檔案.(尾碼是xsd)
在ide中讓其自動建立schema.
3.瞭解關於schema中定義元素與元素之間的關係問題;
對於一個可以包含元素的元素-----複雜類型
<element name="books">
<complexType><!-- 用於定義一個複雜元素 -->
<sequence> <!-- 規定順序 -->
<element name="book">
<complexType>
<sequence>
<element name="name" type="string"/>
<element name="price" type="double"/>
<element name="author" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
4.將我們的schema約束檔案關聯到xml檔案中.
----------------------------------------------------------------------------
複習:
1.xml
組成部分:1.文檔聲明 2.元素 3.屬性 4.注釋 5.CDATA 6.指令。
2.約束
1.DTD
匯入方式三種
1.內部
2.外部
1.本地 SYSTEM
2.網路 PUBLIC
2.DTD----元素 屬性 實體
3.SCHEMA----名稱空間
它是用於定義一個名字,給我們xsd檔案起一個可以掛起的位置。這是一個虛擬名稱,
一般情況下,我們使用網域名稱 (http;//www.itcast.cn),在xml檔案中可以匯入我們的名稱空間,
並在主個空間下尋找到我們的xsd檔案。這樣就可以對xml進行約束。
schema與dtd區別。
----------------------------------------------------------------
關於schema文法
1.所有的schema文檔(xsd檔案),它們的根項目全是schema
2.targetNamespace---用於定義名稱空間
3.xmlns---用於引入一個名稱空間
在xmlns:名稱
這個名稱是首碼,它可以協助在一個xml檔案中匯入多個schema時,進行區分.
4.elementFormDefault 用於控制首碼在什麼時候可以寫.
unqualified: 根項目加首碼,子項目可以不加
qualified:根項目加首碼,子項目必須加。
關於在schema檔案中定義屬性.
定義元素element
maxOccurs屬性可以定義子項目的個數.
--------------------------------------------------------
定義兩個xsd檔案,在一個xml檔案中匯入.
books.xml
books.xsd---將這個xsd中的price元素在price.xsd中聲明.
price.xsd ---它裡面聲明一個price元素,要求 值必須在50-100之間。
-------------------------------------------------------------------------------------
關於解析xml檔案.
javascript時,通過js對xml進行解析,產生document對象。
通過js解析是用戶端操作。
在伺服器端通過java代碼對xml進行解析.
解析xml----就是對xml檔案進行讀寫操作.(我們不是使用io)
關於java中怎樣解析xml檔案(方式)
解析xml有兩種方式
1.dom
2.sax
3.pull
關於dom與sax解析的區別?
什麼是dom解析:將整個xml文檔載入到jvm記憶體中,產生一個dom樹。我們可以很方便的對xml進行讀寫操作.
什麼是sax解析:這種方式是基於事件驅動。讀取一行,解析一行。所以sax解析只能進行讀操作,不能進行寫操作。
xml解析具體實現
Jaxp(sun)---sum標準 解析方式 dom sax解析 不需要匯入任何jar包 jdk中就包含API
以下兩種方式,如果要使用,需要匯入第三方jar包
Jdom、
dom4j(重點)---在架構中應用比較多 struts2 hibernate spring
hibernate4以後,關於xml解析採用 xstream。(後面會講)
----------------------------------------------------------------------------------------------
jaxp的解析:
JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成
對於dom樹,所有節點 Node Element Text Attr Document
1.dom解析.
對books.xml檔案進行dom解析
步驟:
1.DocumentBuilderFactory---關於dom解析工廠,得到這個工廠就可以擷取解析器.
2.DocumentBuilder ---解析器類,通過解析器類可以擷取xml檔案的Document對象.
3.Document代表整個文檔,其實就是dom樹,我們得到這個樹就可以操作樹中的任意一個節點.
得到Document對象後使用的API
1.getElementsByTagName(String name); 根據名稱擷取標籤.
2.getTextContent(); 擷取標籤中的文本資訊.
NodeList
1.getLength() 得到長度
2.Node item(int index) 得到第幾項.
3.getChildNodes() 擷取所有子節點.
4.getNodeName() getNodeType() getNodeValue();
問題:將整個文檔中的所有內容都遍曆出來,怎樣做?
需要使用遞迴方式,怎樣判斷是否結束。 hasChildNodes()這個方法可以判斷是否具有子項目。
如果有子項目,使用getChildNodes()去擷取,
作用擴充題:完成對一個xml檔案的遍曆。
--------------------------------------------------------------------------------------
5.getAttribute() 擷取屬性
6.關於jaxp的create操作
建立Element-----document.createElement("name")
建立Attribute---
建立Text -------element.setTextContent("textvalue");
7.修改
8.刪除
getParentNode() 擷取父節點.
removeChild() 刪除子節點. 注意要通過父節點來操作。
removeAttribute();---刪除屬性操作.
---------------------------------------------------------------------------------
2.sax解析(瞭解)
它只能讀不能寫。
它是基於事件驅動方式。
xml介紹 約束 解析