Day1 itheima_xml基礎

1,主要內容

  

    XML及其語法
    XML約束之DTD
    XML編程(CRUD---Create Read Update Delete)
         •xml 解析器
              •dom
             •sax
             •dom4j
             •pull
    XML約束之Schema
2,什麼是xml
 
      XML是指可擴展標記語言(eXtensible Markup Language),它是一種標記語言,很類似HTML。它被設計的宗旨是表示數據,而非顯示數據
      XML標籤沒有被預定義,需要用戶自行定義標籤
      XML技術是W3C組織(World Wide Web Consortium萬維網聯盟)發佈的,目前遵循的是W3C組織於2000年發佈的XML1.0規範。
      XML被廣泛認爲是繼Java之後在Internet上最激動人心的新技術。
3,xml技術用於解決什麼問題?
   
   在現實生活中大量存在有關係的數據,如圖所示。
   問題:這樣的數據如何交給計算機處理呢?
  
 
lXML語言出現的根本目標在於描述上圖那種,在現實生活中經常出現的有關係的數據。
lxm語言是一種通用的數據交換格式。
lXML語言中,它允許用戶自定義標籤。一個標籤用於描述一段數據;一個標籤可分爲開始標籤和結束標籤,在開始標籤和結束標籤之間,又可以使用其它標籤描述其它數據,以此來實現數據關係的描述。例如:
lxml文件裏的數據需要使用程序將其讀出來.
 
<?xml version="1.0" encoding="UTF-8"?>

<中國>
	<北京>
		<海淀></海淀>
		<豐臺></豐臺>
	</北京>
	<廣東>
		<廣州></廣州>
		<東莞></東莞>
	</廣東>
	<湖北>
		<武漢></武漢>
		<襄陽></襄陽>
	</湖北>
</中國>

4,xml常見應用
 
l在Java開發中,傳統的配置文件是*.properties屬性文件(key=value),而XML表示的數據更爲豐富。
lXML技術除用於描述有關係的數據外,還經常用作軟件配置文件,以描述程序模塊之間的關係。(如後面將要學習到的Struts2、Spring和Hibernate都是基於XML作爲配置文件的)
在一個軟件系統中,通過XML配置文件可以提高系統的靈活性。即程序的行爲是通過XML文件來配置的,而不是硬編碼
5,XML語法
l一個XML文件分爲如下幾部分內容:
文檔聲明
元素
屬性
註釋 
CDATA區 、特殊字符
處理指令(processing instruction(PI)
     文檔聲明
l在編寫XML文檔時,需要先使用文檔聲明來聲明XML文檔。且必須出現在文檔的第一行
l最簡單的語法:<?xml version=“1.0”?>
lencoding屬性說明文檔所使用的字符編碼,默認爲UTF-8保存在磁盤上的文件編碼要與聲明的編碼一致。

  如:<?xml version=“1.0” encoding=“GB2312”?>

lstandalone屬性說明文檔是否獨立,即是否依賴其他文檔。

  如:<?xml version=“1.0” standalone=“yes”?>

l常見的錯誤    標點符號中式的.
     元素
lXML元素指XML文件中出現的標籤。一個標籤分爲起始和結束標籤(不能省略)。一個標籤有如下幾種書寫形式:
包含標籤主體:<mytag>some content</mytag>
不含標籤主體:<mytag/>
l一個標籤中可以嵌套若干子標籤,但所有標籤必須合理的嵌套,不允許有交叉嵌套。
<mytag1><mytag2></mytag1></mytag2>   WRONG
l一個XML文檔必須有且僅有一個根標籤,其他標籤都是這個根標籤的子標籤或孫標籤。
 
 l對於XML標籤中出現的所有空格和換行,XML解析程序都會當作標籤內容進行處理。例如:下面兩段內容的意義是不一樣的。
 

第一段:             

<中國><北京/></中國>

 

第二段:   給人看的

<中國>\r\n

\t  <北京/>

</中國>

l由於在XML中,空格和換行都作爲原始內容被處理,所以,在編寫XML文件時,使用換行和縮進等方式來讓原文件中的內容清晰可讀的“良好”書寫習慣可能要被迫改變。 (查看 JQuery)

 

命名規範

  
l一個XML元素可以包含字母、數字以及其它一些可見字符,但必須遵守下面的一些規範:
l區分大小寫,例如,<P><p>是兩個不同的標記。
l不能以數字或"_" (下劃線)開頭。
l不能以xml(XML、或Xml )開頭。   xml保留的關鍵字
l不能包含空格。
l名稱中間不能包含冒號(:(有特殊用途)
 
屬性
 
 
l一個標籤可以有多個屬性,每個屬性都有它自己的名稱和取值,例如:

  <mytag name="value"/>

l屬性值一定要用雙引號(")或單引號(')引起來
l定義屬性必須遵循與標籤相同的命名規範
lXML技術中,標籤屬性所代表的信息,如果沒有標籤體,也可以被改成用子元素的形式來描述,例如:

  <mytag>

   <name>

     <firstname></firstnamename>

     <secondname></secondname>

   </name>

  </mytag>

註釋

lXml文件中的註釋採用:<!--這是註釋-->
l注意:
XML聲明之前不能有註釋
註釋不能嵌套,例如:

  <!--大段註釋

  ……

  <!--局部註釋-->  Wrong

  ……

  -->  

 

6,CDATA
   
lCDATACharacter Data的縮寫
l作用:把標籤當做普通文本內容;
l語法:<![CDATA[內容]]>
 

<![CDATA[

  <itcast>www.itcast.cn</itcast>

]]>

以上紅色部分被當做普通文本而不是標籤

7,特殊字符

 

l對於一些單個字符,若想顯示其原始樣式,也可以使用轉義的形式予以處理。

8,處理指令

  

l處理指令,簡稱PI(Processing Instruction)
l作用:用來指揮軟件如何解析XML文檔。
l語法:必須以“<?”作爲開頭,以“?>”作爲結尾。
l常用處理指令:
XML聲明:<?xml version=“1.0” encoding=“GB2312”?>

xml-stylesheet指令

  

<?xml-stylesheet type=“text/css” href=“some.css”?>

注:對中文命名的標籤元素不起作用

9,xml約束概述

   

l什麼是XML約束
XML技術裏,可以編寫一個文檔來約束一個XML文檔的書寫規範,這稱之爲XML約束。
l約束技術
XML DTD
XDR
SOX
XML Schema

 

爲什麼需要約束?

  

lXML都是用戶自定義的標籤,若出現小小的錯誤,軟件程序將不能正確地獲取文件中的內容而報錯。(如:Tomcat)
lxml常用來做配置文件,那麼框架的使用者在用該框架的時候該怎麼樣寫呢?
l兩個概念:
格式良好的XML:遵循XML語法的XML
有效的XML:遵循約束文檔的XML
l總之:約束文檔定義了在XML中允許出現的元素名稱、屬性及元素出現的順序等等。
 
10,xml約束之dtd
   DTD(Document Type Definition),全稱爲文檔類型定義

  

文件清單:book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 書架 SYSTEM "book.dtd">
<書架>
	<書>
		<書名>Java就業培訓教程</書名>
		<作者>張孝祥</作者>
		<售價>39.00元</售價>
	</書>
	<書>
		<書名>JavaScript網頁開發</書名>
		<作者>張孝祥</作者>
		<售價>28.00元</售價>
	</書>
</書架>


 

DTD文件應使用UTF-8Unicode

 

文件清單:book.dtd
	
<!ELEMENT 書架 (書+)>
	<!ELEMENT 書 (書名,作者,售價)>
	<!ELEMENT 書名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售價 (#PCDATA)>


 

  xml 內部編寫DTD

 

DTD約束即可以作爲一個單獨的文件編寫,也可以在XML文件內編寫。(單獨的DTD文件要以UTF-8保存)

在XML 文檔中編寫DTD示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 書架 [
	<!ELEMENT 書架 (書+)>
	<!ELEMENT 書 (書名,作者,售價)>
	<!ELEMENT 書名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售價 (#PCDATA)>
]>
<書架>
	<書>
		<書名>Java就業培訓教程</書名>
		<作者>張孝祥</作者>
		<售價>39.00元</售價>
	</書>
	...
</書架>

 

引入外部DTD文檔

 

lXML使用DOCTYPE聲明語句來指明它所遵循的DTD文檔,有兩種形式:
當引用的DTD文檔在本地時,採用如下方式:

<!DOCTYPE 根元素 SYSTEM “DTD文檔路徑”>

如:<!DOCTYPE 書架 SYSTEM “book.dtd”>

當引用的DTD文檔在公共網絡上時,採用如下方式:

<!DOCTYPE 根元素 PUBLIC “DTD名稱” “DTD文檔的URL”>

如:<!DOCTYPE web-app PUBLIC

  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

  "http://java.sun.com/dtd/web-app_2_3.dtd">

 

11,DTD約束語法細節

l元素定義
l屬性定義
l實體定義

 元素定義1

  

lDTD文檔中使用ELEMENT聲明一個XML元素,語法格式如下所示:

   <!ELEMENT 元素名稱元素類型>

l元素類型可以是元素內容、或類型
如爲元素內容:則需要使用()括起來,如

<!ELEMENT 書  (書名,作者,售價)>

<!ELEMENT 書名 (#PCDATA)>

如爲元素類型,則直接書寫,DTD規範定義瞭如下幾種類型:
EMPTY:用於定義空元素,例如<br/> <hr/>

ANY:表示元素內容爲任意類型

 

PCDATA

lPCDATA 的意思是被解析的字符數據(parsed character data)。
l可把字符數據想象爲 XML 元素的開始標籤與結束標籤之間的文本。
lPCDATA 是會被解析器解析的文本。這些文本將被解析器檢查實體以及標記。
l文本中的標籤會被當作標記來處理,而實體會被展開。
l不過,被解析的字符數據不應當包含任何 &< 或者 > 字符;需要使用 &amp;&lt; 以及 &gt; 實體來分別替換它們。

CDATA

lCDATA 的意思是字符數據(character data)。

CDATA 是不會被解析器解析的文本。在這些文本中的標籤不會被當作標記來對待,其中的實體也不會被展開

元素定義2

l元素內容中可以使用如下方式,描述內容的組成關係
用逗號分隔,表示內容的出現順序必須與聲明時一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
|分隔,表示任選其一,即多個只能出現一個

  <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>

l在元素內容中也可以使用+、*、?等符號表示元素出現的次數:

  +: 一次或多次 (+)    

   ?: 0次或一次 (?)

   *: 0次或多次  (書*)

l也可使用圓括號( )批量設置,例

  <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

attribute 屬性定義

 

lxml文檔中的標籤屬性需通過ATTLIST爲其設置屬性
l語法格式:

  <!ATTLIST 元素名

  屬性名1 屬性值類型設置說明

  屬性名2 屬性值類型設置說明

  ……

  >

l屬性聲明舉例:

<!ATTLIST 商品

  類別 CDATA #REQUIRED

  顏色 CDATA #IMPLIED

>

l對應XML文件:

  <商品類別="服裝" 顏色="黃色">…</商品>

  <商品類別="服裝">…</商品>

 

 

l設置說明:
#REQUIRED:必須設置該屬性
#IMPLIED:可以設置也可以不設置
#FIXED:說明該屬性的取值固定爲一個值,在 XML 文件中不能爲該屬性設置其它值。但需要爲該屬性提供這個值
直接使用默認值:在 XML 中可以設置該值也可以不設置該屬性值。若沒設置則使用默認值。但需要爲該屬性提供這個值

 

l舉例:

      <!ATTLIST頁面作者

       姓名 CDATA #IMPLIED

       年齡 CDATA #IMPLIED

       聯繫信息 CDATA #REQUIRED

       網站職務 CDATA #FIXED "頁面作者"

       個人愛好 CDATA "上網"

       >

常用屬性值類型

CDATA表示屬性值爲普通文本字符串
ENUMERATED
ID  indentity
ENTITY(實體)

屬性值類型àENUMERATED

屬性的類型可以是一組取值的列表,在 XML 文件中設置的屬性值只能是這個列表中的某個值(枚舉)

 

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 購物籃 [
	<!ELEMENT 肉 EMPTY>
	<!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]>
<購物籃>
     <肉 品種 ="魚肉"/>
     <肉 品種 ="牛肉 "/>
     <肉/>
</購物籃>

屬性值類型 ID

表示屬性的設置值爲一個唯一值。
ID 屬性的值只能由字母,下劃線開始,不能出現空白字符
<?xml version = "1.0" encoding="GB2312" ?>

<!DOCTYPE 聯繫人列表[
	<!ELEMENT 聯繫人列表 ANY>
	<!ELEMENT 聯繫人 (姓名,EMAIL)>
	<!ELEMENT 姓名 (#PCDATA)>
	<!ELEMENT EMAIL (#PCDATA)>
	<!ATTLIST 聯繫人 編號 ID #REQUIRED>
]>

<聯繫人列表>
	<聯繫人 編號="a1">
		<姓名>張三</姓名>
		<EMAIL>[email protected]</EMAIL>
     </聯繫人>
	<聯繫人 編號="b1">
		<姓名>李四</姓名>
		<EMAIL>[email protected]</EMAIL>
	</聯繫人>
</聯繫人列表>

實體定義

實體用於爲一段內容創建一個別名,以後在XML文檔中就可以使用別名引用這段內容了。
DTD定義中,一條<!ENTITY …>語句用於定義一個實體。
實體可分爲兩種類型:引用實體和參數實體。


引用實體

 

l引用實體主要XML 文檔中被應用
語法格式:
<!ENTITY 實體名稱 "實體內容">:直接轉變成實體內容
引用方式:

&實體名稱;

 舉例:

  <!ENTITY shit"oh, holy shit">

   ……

   &shit;

參數實體

 

參數實體被 DTD 文件自身使用
語法格式:

   <!ENTITY % 實體名稱 "實體內容" >

引用方式:

%實體名稱;

  舉例1

   

 <!ENTITY % TAG_NAMES "姓名 | EMAIL | 電話 | 地址">
	
    <!ELEMENT 個人信息 (% TAG_NAMES; | 生日)>
	 <!ELEMENT 客戶信息 (% TAG_NAMES; | 公司名)>


舉例2

<!ENTITY % common.attributes
	 " id ID #IMPLIED 
	account CDATA #REQUIRED "
>
...
<!ATTLIST purchaseOrder  %common.attributes;>
<!ATTLIST item %common.attributes;>


12  XML編程(CRUD)

  java 解析xml概述

    

lXML解析方式分爲兩種:DOM方式和SAX方式
DOMDocument Object Model,文檔對象模型。這種方式是W3C推薦的處理XML的一種方式。
SAXSimple API for XML。這種方式不是官方標準,屬於開源社區XML-DEV,幾乎所有的XML解析器都支持它。
lXML解析開發包
JAXPSUN公司推出的解析標準實現。
Dom4J是開源組織推出的解析開發包。(牛,大家都在用,包括SUN公司的一些技術的實現都在用)
JDom:是開源組織推出的解析開發包。

 

JAXP

JAXP:(Java API for XML Processing)開發包是JavaSE的一部分,它由以下幾個包及其子包組成:
org.w3c.dom:提供DOM方式解析XML的標準接口
org.xml.sax:提供SAX方式解析XML的標準接口
javax.xml:提供瞭解析XML文檔的類
ljavax.xml.parsers包中,定義了幾個工廠類。我們可以通過調用這些工廠類,得到對XML文檔進行解析的DOMSAX解析器對象。
DocumentBuilderFactory
SAXParserFactory

 

使用JAXP進行DOM解析

javax.xml.parsers 包中的DocumentBuilderFactory用於創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法,這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象並返回

 

 

獲得JAXP中的DOM解析器

 

調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。
調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。
調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進而可以利用DOM特性對整個XML文檔進行操作了。
 
Dom編程
  
DOM模型(document object model)
DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關係,解析成一個個Node對象(節點)
dom中,節點之間關係如下:
位於一個節點之上的節點是該節點的父節點(parent)
一個節點之下的節點是該節點的子節點(children
同一層次,具有相同父節點的節點是兄弟節點(sibling
一個節點的下一個層次的節點集合是節點後代(descendant)
父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)
 
節點類型
 Node對象
   
 Node對象提供了一系列常量來代表結點的類型,當開發人員獲得某個Node類型後,就可以把Node節點轉換成相應的節點對象(Node的子類對象),以便於調用其特有的方法。(查看API文檔)
 Node對象提供了相應的方法去獲得它的父結點或子結點。編程人員通過這些方法就可以讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。
 
更新xml文檔
 
ljavax.xml.transform包中的Transformer類用於把代表XML文件的Document對象轉換爲某種格式後進行輸出,例如把xml文件應用樣式表後轉成一個html文檔。利用這個對象,當然也可以把Document對象又重新寫入到一個XML文件中。
lTransformer類通過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以通過:
javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象,
javax.xml.transform.stream.StreamResult對象來表示數據的目的地。
 Transformer對象通過TransformerFactory獲得
 
SAX解析
  在使用 DOM 解析 XML 文檔時,需要讀取整個 XML 文檔,在內存中構架代表整個 DOM 樹的Doucment對象,從而再對XML文檔進行操作。此種情況下,如果 XML 文檔特別大,就會消耗計算機的大量內存,並且容易導致內存溢出。  
  SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完纔對文檔進行操作。
 
SAX採用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器:
解析器可以使用JAXPAPI創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文檔。
解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作爲方法的參數傳遞給事件處理器。
事件處理器由程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕鬆地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理
 
 
l閱讀ContentHandler API文檔,常用方法:startElementendElementcharacters
SAX方式解析XML文檔
l使用SAXParserFactory創建SAX解析工廠

SAXParserFactoryspf = SAXParserFactory.newInstance();

l通過SAX解析工廠得到解析器對象 

SAXParser sp = spf.newSAXParser();

l通過解析器對象得到一個XML的讀取器

XMLReaderxmlReader = sp.getXMLReader();

l設置讀取器的事件處理器 

xmlReader.setContentHandler(new BookParserHandler());

l解析xml文件 

xmlReader.parse("book.xml");

 

DOM4J解析XML文檔

lDom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4jAPI相對要複雜一些,但它提供了比JDOM更好的靈活性。
lDom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件採用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
l使用Dom4j開發,需下載dom4j相應的jar文件。
lDOM4j中,獲得Document對象的方式有三種:

  1.讀取XML文件,獲得document對象            

                   SAXReader reader = new SAXReader();
 
             Document   document = reader.read(new File("input.xml"));

  2.解析XML形式的文本,得到document對象.

                   String text = "<members></members>";
 
             Document document = DocumentHelper.parseText(text);

  3.主動創建document對象.

                  Document document = DocumentHelper.createDocument();
 
            //創建根節點

                  Element root = document.addElement("members");

節點對象

 

l1.獲取文檔的根節點.

      Element root = document.getRootElement();

l2.取得某個節點的子節點.

  Element element=node.element(“書名");

l3.取得節點的文字

      String text=node.getText();

l4.取得某節點下所有名爲“member”的子節點,並進行遍歷.
 
List nodes = rootElm.elements("member");
 

  for (Iterator it = nodes.iterator(); it.hasNext();) {
 
    Element elm = (Element) it.next();
 
   // do something
 }
l5.對某節點下的所有子節點進行遍歷.
  
 for(Iterator it=root.elementIterator();it.hasNext();){
 
      Element element = (Element) it.next();
 
      // do something
    }
l6.在某節點下添加子節點.
Element
ageElm = newMemberElm.addElement("age");
l7.設置節點文字.
 
element.setText("29");
l8.刪除某節點.
//
childElm是待刪除的節點,parentElm是其父節點

    parentElm.remove(childElm);

l9.添加一個CDATA節點.
Element
contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());

節點對象屬性

l1.取得某節點下的某屬性
 
   Element root=document.getRootElement();    
 
   //屬性名name

         Attribute attribute=root.attribute("size");

l2.取得屬性的文字
 
   String text=attribute.getText();
l3.刪除某屬性
 
Attribute attribute=root.attribute("size");
 
root.remove(attribute);

節點對象屬性

l3.遍歷某節點的所有屬性
 
  Element root=document.getRootElement();    
 
 for(Iterator it=root.attributeIterator();it.hasNext();){
 
        Attribute attribute = (Attribute) it.next();
 
        String text=attribute.getText();
 
        System.out.println(text);
 
   }
l4.設置某節點的屬性和文字.
  
newMemberElm.addAttribute("name", "sitinspring");
l5.設置屬性的文字
  
Attribute attribute=root.attribute("name");
 
  attribute.setText("sitinspring");

將文檔寫入XML文件

 

l1.文檔中全爲英文,不設置編碼,直接寫入的形式.
 
XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));
 
writer.write(document);
 
writer.close();
l2.文檔中含有中文,設置編碼格式寫入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
//
指定XML編碼                  

     format.setEncoding("GBK");       
XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml"),format);
writer.write(document);
writer.close();

字符串與xml的轉換

 

l1.將字符串轉化爲XML
 

     String text = "<members> <member>sitinspring</member></members>";
Document
document = DocumentHelper.parseText(text);

l2.將文檔或節點的XML轉化爲字符串.

     SAXReader reader = new SAXReader();
Document  
document = reader.read(new File("input.xml"));            
Element root=
document.getRootElement();    

            
String docXmlText=document.asXML();

String rootXmlText=root.asXML();
Element
memberElm=root.element("member");
String
memberXmlText=memberElm.asXML();

pull解析器

lpull 解析器是一個第三方的開源api,其解析原理與sax 解析原理很相像,都是採用事件驅動的方式.
l不同點: pull 解析器在每次讀取到一段數據之後,需要程序員手動的調用其next() 方法,將當前解析到的這一行的"指針"移到下一行.
lhttp://www.xmlpull.org  &
lhttp://kxml.sourceforge.net/kxml2/

 

l在目前的android 平臺中解析xml 文件都是採用pull解析器,是谷歌力推的xml解析器
lpull 解析器是一個開源的java項目,既可以用於android,也可以用於JavaEE
l在android源碼根目錄的libcore目錄下存放的是pull 解析器相關的所有類庫.

XML約束之Schema

lXML Schema 也是一種用於定義和描述 XML 文檔結構與內容的模式語言,其出現是爲了克服 DTD 的侷限性
lXML Schema VS DTD
XML Schema符合XML語法結構。
DOMSAXXML API很容易解析出XML Schema文檔中的內容。
XML Schema名稱空間支持得非常好。
XML SchemaXML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。
XML Schema定義約束的能力非常強大,可以對XML實例文檔作出細緻的語義限制。
XML Schema不能像DTD一樣定義實體,比DTD更復雜,但Xml Schema現在已是w3c組織的標準,它正逐步取代DTD。 
 
Schema約束快速入門
lXML Schema 文件自身就是一個XML文件,但它的擴展名通常爲.xsd
l一個XML Schema文檔通常稱之爲模式文檔(約束文檔),遵循這個文檔書寫的xml文件稱之爲實例文檔
lXML文件一樣,一個XML Schema文檔也必須有一個根結點,但這個根結點的名稱爲Schema
l編寫了一個XML Schema約束文檔後,通常需要把這個文件中聲明的元素綁定到一個URI地址上,在XML Schema技術中有一個專業術語來描述這個過程,即把XML Schema文檔聲明的元素綁定到一個名稱空間上,以後XML文件就可以通過這個URI(即名稱空間)來告訴解析引擎,xml文檔中編寫的元素來自哪裏,被誰約束。
 
<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
					  targetNamespace="http://www.itcast.cn"
					  elementFormDefault="qualified">
	<xs:element name='書架' >
		<xs:complexType>
			<xs:sequence maxOccurs='unbounded' >
				<xs:element name='書' >
					<xs:complexType>
						<xs:sequence>
							<xs:element name='書名' type='xs:string' />
							<xs:element name='作者' type='xs:string' />
							<xs:element name='售價' type='xs:string' />
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>

<itcast:書架 xmlns:itcast="http://www.itcast.cn"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation=“http://www.itcast.cn book.xsd">

	<itcast:書>
		<itcast:書名>JavaScript網頁開發</itcast:書名>
		<itcast:作者>張孝祥</itcast:作者>
		<itcast:售價>28.00元</itcast:售價>
	</itcast:書>
</itcast:書架>
名稱空間的概念
lXML Schema中,每個約束模式文檔都可以被賦以一個唯一的名稱空間,名稱空間用一個唯一的URIUniform Resource Identifier,統一資源標識符)表示。在Xml文件中書寫標籤時,可以通過名稱空間聲明(xmlns),來聲明當前編寫的標籤來自哪個Schema約束文檔。如:

  <itcast:書架 xmlns:itcast=“http://www.itcast.cn”>

  <itcast:>……</itcast:>

  </itcast:書架>

   此處使用itcast來指向聲明的名稱,以便於後面對名稱空間的引用。

l注意:名稱空間的名字語法容易讓人混淆,儘管以 http:// 開始,那個 URL 並不指向一個包含模式定義的文件。事實上,這個 URLhttp://www.itcast.cn根本沒有指向任何文件,只是一個分配的名字。
使用名稱空間引入Schema
l爲了在一個XML文檔中聲明它所遵循的Schema文件的具體位置,通常需要在Xml文檔中的根結點中使用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">

lschemaLocation此屬性有兩個值。第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置,兩者之間用空格分隔
l注意,在使用schemaLocation屬性時,也需要指定該屬性來自哪裏。
使用默認名稱空間
基本格式:
	xmlns="URI"  
舉例:
	<書架 xmlns="http://www.it315.org/xmlbook/schema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation=“http://www.itcast.cn book.xsd">
		<書>
		<書名>JavaScript網頁開發</書名>
		<作者>張孝祥</作者>
		<售價>28.00元</售價>
		</書>
	<書架>


使用名稱空間引入多個XML Schema文檔

文件清單:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>

<書架 xmlns="http://www.it315.org/xmlbook/schema" 
	xmlns:demo="http://www.it315.org/demo/schema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.it315.org/xmlbook/schema 				http://www.it315.org/xmlbook.xsd 
		http://www.it315.org/demo/schema http://www.it315.org/demo.xsd">
	<書>
		<書名>JavaScript網頁開發</書名>
		<作者>張孝祥</作者>
		<售價 demo:幣種=”人民幣”>28.00元</售價>
	</書>
</書架>


不使用名稱空間引入XML Schema文檔

 

文件清單:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<書架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="xmlbook.xsd">
	<書>
		<書名>JavaScript網頁開發</書名>
		<作者>張孝祥</作者>
		<售價>28.00元</售價>
	</書>
</書架>

XML Schema文檔中聲明名稱空間

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

         targetNamespace="http://www. itcast.cn"

         elementFormDefault="qualified">

<xs:schema>

ltargetNamespace元素用於指定schema文檔中聲明的元素屬於哪個名稱空間。

elementFormDefault元素用於指定,該schema文檔中聲明的根元素及其所有子元素都屬於targetNamespace所指定的名稱空間

 

 

 


 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章