java語言程序設(shè)計(jì)java_xml_第1頁
java語言程序設(shè)計(jì)java_xml_第2頁
java語言程序設(shè)計(jì)java_xml_第3頁
java語言程序設(shè)計(jì)java_xml_第4頁
java語言程序設(shè)計(jì)java_xml_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、XML基礎(chǔ)Xml 的數(shù)據(jù)傳輸XML文檔 顯示服務(wù)DTD樣式表處理程序XML 解析器解析樹呈現(xiàn)程序XMLo XML 即可擴(kuò)展標(biāo)記語言(Extensible Markup Language),是一種平臺(tái)無關(guān)的表示數(shù)據(jù)的方法。簡單地說,使用 XML 創(chuàng)建的數(shù)據(jù)可以被任何應(yīng)用程序在任臺(tái)上讀取。甚至可以通過手動(dòng)編碼來編輯和創(chuàng)建XML 文檔。其原因是,XML 與 HTML 一樣,都是建立在相同的基于標(biāo)記技術(shù)基礎(chǔ)之上。o XML(Extensible Markup Language)是一種可擴(kuò)展的置標(biāo)語言。o XML來源于SGML(標(biāo)準(zhǔn)通用置標(biāo)語言), 但XML是它的簡化,但保留了其精華。W3C于1998年

2、2月批準(zhǔn)了XML的1.0版本。成為一個(gè)國際標(biāo)準(zhǔn)。置標(biāo)指計(jì)算機(jī)所能理解的信息符號(hào),通過此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。XMl的特點(diǎn) XML 文檔是一個(gè)自我描述的數(shù)據(jù)集合 XML 的優(yōu)點(diǎn) 自我描述性 可移植性 以樹結(jié)構(gòu)描述數(shù)據(jù) 提供可用于數(shù)據(jù)庫的功能 XML 的缺點(diǎn) 數(shù)據(jù)存取慢 缺少數(shù)據(jù)庫的功能 在生產(chǎn)環(huán)境中將失效文檔格式定義 DTDXML 的優(yōu)點(diǎn)在于它允許您定義自己的有意義的標(biāo)記,因此您可以最大程度地定制文檔。但 XML 就是 XML(可擴(kuò)展),而人就是人(瘋狂的人),這可能很快就會(huì)無法控制。解決方案是 DTD,它指定了 XML 文檔的標(biāo)記。簡而言之,DTD 指定:可以在文檔中

3、存在的元素、那些元素可以具有的屬性、在元素內(nèi)部元素的層次結(jié)構(gòu)以及元素在整個(gè)文檔中出現(xiàn)的順序。目的:確保文檔有效DTD(Document Type Definition,文檔格式定義)。對于想利用XML文件來交換信息的實(shí)體來說,他們之間必須有一個(gè)約定即編寫XML文件可以用哪些標(biāo)記,母元素中能夠包括哪些子元素,各個(gè)元素出現(xiàn)的順序,元素中的屬性怎樣定義等。這樣他們在用XML交換數(shù)據(jù)時(shí)才能夠暢通無阻,這種約定稱為DTD。可以把DTD看作編寫XML文件的模板。對于同行業(yè)之間的XML數(shù)據(jù)交換,有一個(gè)固定的DTD將會(huì)方便很多。比如說, 如果網(wǎng)上的各大電子商場的XML網(wǎng)頁都遵循同一個(gè)DTD時(shí),那么我們就可以輕

4、松地依據(jù)這個(gè)DTD 編寫一個(gè)應(yīng)用程序,去網(wǎng)上將我們感興趣的東西自動(dòng)抓回來。o格式正確的 XML 文檔是滿足以下三個(gè)基本結(jié)構(gòu)需求的文檔:o 有一個(gè)包含所有其它元素的父(或根)元素o 每個(gè)開始標(biāo)記都有結(jié)束標(biāo)記o 所有元素都正確嵌套的oooopDTD 的第一行定義了 XML 文檔的父元素: person 。person 元素有兩個(gè)子元素: firstname 和 lastname 。第二和第三行包含了元素屬性 #PCDATA ,它表明 firstname 和lastname 元素可能包含經(jīng)過語法分析的字符數(shù)據(jù)(在這種情況下是文本)。DTD 文件的最后一行描述了一個(gè)空標(biāo)記: nothing 。pp從3

5、 中的 DTD 可以看出,任何閱讀我們的 XML 文檔的人(以及對它進(jìn)行語法分析的語法分析器)都知道 person 元素僅包含兩個(gè)文本元素: firstname 和 lastname 。此外,DTD 規(guī)定,在整個(gè)文檔中, firstname 元素必須在 lastname 元素之前出現(xiàn)。o oJaneFungoo DTD 中的內(nèi)容雖然 DTD 不是必需的,但它們確實(shí)帶來方便。DTD 適合三個(gè)基本用途。它能:o 對標(biāo)記編制文檔o 加強(qiáng)標(biāo)記參數(shù)內(nèi)部的一致性o 使 XML 語法分析器能夠確認(rèn)文檔o 如果不對 XML 文檔進(jìn)行 DTD 定義,文檔就無法由 XML 語法解析器進(jìn)行確認(rèn)。解析器 XML解析讀

6、取XML文檔并將文檔分解為可進(jìn)行分析的幾個(gè)元素的過程處理 XML 文檔 解析器檢查 XML 文檔的有效性和格式規(guī)范 創(chuàng)建解析樹并將其傳遞給呈現(xiàn)程序 呈現(xiàn)程序?qū)@示此解析樹 解析器將創(chuàng)建一系列對象,用于顯示與 XML 文檔關(guān)聯(lián)的樣式表解析器概述1.DOM2.SAX3.JDOM4.DOM4J文檔對象模型 dom基于樹和節(jié)點(diǎn)的文檔對象模型(Document Object Module)稱為DOM,DOM 采用建立樹形結(jié)構(gòu)的方式訪問。DOM 解析器把 XML 文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對樹進(jìn)行遍歷。用 DOM 解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigatio

7、n APIs 訪問所需的樹節(jié)點(diǎn)來完成任務(wù)??梢院苋菀椎奶砑雍托薷臉渲械脑?。然而由于使用 DOM 解析器的時(shí)候需要處理整個(gè) XML 文檔,所以對性能和內(nèi)存的要求比較高,尤其是遇到很大的 XML 文件的時(shí)候。由于它的遍歷能力,DOM 解析器常用于XML文檔需要頻繁的改變的服務(wù)中。o1。W3C制定的一套跨平臺(tái)和語言標(biāo)準(zhǔn),表示文檔的內(nèi)容和模型2。用Level(級(jí)別)的形式代替版本。Level1定義了文檔中內(nèi)容的功能查找方evel2提供了對XML,HTML和CSS等內(nèi)容模型的模塊選項(xiàng)。Level3制定中,為特定類型提供更多的工具如XML的驗(yàn)證公交等3。基于對象的將 XML 文檔表示為樹4。在內(nèi)存中解析

8、和存儲(chǔ) XML 文檔5。允許隨機(jī)訪問文檔的不同部分6。DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹, 并可以對樹進(jìn)行遍歷文檔對象模型采用的模式樹模式 樹模型 每個(gè)項(xiàng)目都表示一個(gè)節(jié)點(diǎn) 每個(gè)終端項(xiàng)目都表示一個(gè)葉節(jié)點(diǎn) 直接上級(jí)節(jié)點(diǎn)表示父節(jié)點(diǎn) 任何上級(jí)節(jié)點(diǎn)都表示祖先節(jié)點(diǎn) 從樹的一個(gè)部分可以到達(dá)樹的任何其他部分請看下列“department.xml”XML 文檔:約瑟夫瑪麗DOM 中“department.xml”的結(jié)構(gòu)如下:DepartmentStudentE-mail: StudentName: 瑪麗 E-mail:mar

9、 Name: 約瑟夫DOM解析函數(shù)o 得到文檔模型的根元素n Element root = doc.getDocumentElement();o 元素Element的函數(shù):n String getTagName()n String getAttribute(“unit”)o 節(jié)點(diǎn)Node的函數(shù):-得到標(biāo)簽的名字-得到元素的unit屬性值n NodeListgetChildNodes()- 得到子節(jié)點(diǎn)的集合n Node getFirstChild()n Node getLastChild()- 得到第一個(gè)子節(jié)點(diǎn)- 得到最后一個(gè)子節(jié)點(diǎn)DOM解析函數(shù)節(jié)點(diǎn)Node的函數(shù):n Nod

10、e getNextSibling() - 得到下一個(gè)兄弟節(jié)點(diǎn)n Node getPreviousSibling()- 得到前一個(gè)兄弟結(jié)點(diǎn)on Node getParentNode()- 得到父節(jié)點(diǎn)n NamedNodeMap getAttributes()- 得到所有的屬性集合n String getNodeName()n String getNodeValue()NodeList的函數(shù)n int getLength()n Node item(int index)- 得到當(dāng)前節(jié)點(diǎn)的名字- 得到當(dāng)前節(jié)點(diǎn)的值o-得到集合長度- 得到集合中的一個(gè)元素使用 DOM 解析 XML 文檔要將 XML 文檔

11、讀入 DOM,請執(zhí)行下列步驟: 獲得一個(gè)新 DocumentBuilderFactory 實(shí)例 使用 DocumentBuilderFactory 構(gòu)建 DocumentBuilder 使用 DocumentBuilder 中的 parse( ) 方法解析給定的文件 將已解析的文檔存儲(chǔ)在 Document 對象中 使用 getElementsByTagName( ) 方法從文檔獲得元素使用 DOM 解析 XML 文檔 DOM 文檔是使用 Transformer 類寫入輸出結(jié)果采用兩個(gè)參數(shù),即 DOMSource 和 StreamResult DOMSource 對象以 DOM 樹形式來保存源樹

12、。StreamResult 對象保存轉(zhuǎn)換結(jié)果 將 XML 數(shù)據(jù)寫入輸出結(jié)果的步驟如下: 創(chuàng)建文檔對象 創(chuàng)建 TransformerFactory 程序的一個(gè)實(shí)例 使用 TransformerFactory 創(chuàng)建 Transformer 類的一個(gè)實(shí)例 使用 Transform 方法將源樹處理至輸出結(jié)果中寫XML文檔函數(shù)o DocumentBuilder 的函數(shù):n Document doc = builder.newDocument(); -新建一個(gè)模型o Document 的函數(shù):n Element createElement(String name) 建立一個(gè)元素n Text createT

13、extNode(String data)-創(chuàng)建一個(gè)文本節(jié)點(diǎn)o Node的函數(shù):n Node appendChild(Node child)- 添加一個(gè)子節(jié)點(diǎn)o Element 的函數(shù):n void setAttribute(String name, String value)- 設(shè)置元素的一個(gè)屬性和屬性值DOM解析演示o MyXMLReader.javao MyXMLWriter.java DOM 最適用的情形 在結(jié)構(gòu)上修改 XML 文檔時(shí) 在內(nèi)存中與其他應(yīng)用程序共享文檔時(shí) DOM 的缺點(diǎn) 將整個(gè)文檔存儲(chǔ)在內(nèi)存中 方法命名慣例不符合 Java 編程慣例SAX的XML簡單API(Simple A

14、PI for XML)o基于稱為SAX,SAX 采用的模型。SAX 解析器在解析XML文檔的時(shí)候可以觸發(fā)一系列的,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,它可以激活一個(gè)回調(diào)方法, 告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX 對內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag。特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX 這種擴(kuò)展能力得到了更好的體現(xiàn)。但用 SAX 解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問同一個(gè)文檔中的多處不同數(shù)據(jù)。1。SAX(Simple API for XML )基于驅(qū)動(dòng), 使用回調(diào)機(jī)制將重要給客戶端應(yīng)用程序2。SAX 的結(jié)構(gòu) 簡單 SAX 應(yīng)用程序的組件

15、包括: 應(yīng)用程序創(chuàng)建一個(gè)解析器和一個(gè)文檔處理程序告訴解析器使用哪個(gè)文檔處理程序告訴解析器處理文檔 解析器 將重要 文檔處理程序 處理給文檔處理程序簡單 SAX 的組件應(yīng)用程序 new DocumentHanlder () new Parser()startDocument解析器文檔處理程序Parse() startElement characters endElement endDocument new Document Hanlder () 用于 XML 解析的 Java API 可使用 SAX 的普通 API 作為 javax.xml 包實(shí)現(xiàn) 易于安裝且快速 更具一致性 使用 Factor

16、y 設(shè)計(jì)模式創(chuàng)建要解析的對象 SAXParser 類中可用的方法如下:SAXParser 方法說明getParser()返回 SAX org.xml.sax.Parser 對象。getProperty()返回指定屬性的值。setProperty()設(shè)置指定值的屬性。getXMLReader()返回 SAX org.xml.sax.XMLReader 對象。isNamespaceAware()指明是否配置解析器以了解名字空間。isValidating()指明是否配置解析器以驗(yàn)證 XML 文檔。SAXParserHandler 類 解釋如何捕獲和響應(yīng)各個(gè) startDocument( ) 和 en

17、dDocument( )激發(fā)的 startElement( ) 和 endElement( )激發(fā)的是在文檔的起始處和結(jié)束處被是在遇到起始標(biāo)記和結(jié)束標(biāo)記時(shí)被 characters( )是在遇到字符數(shù)據(jù)時(shí)被激發(fā)的使用SAX 解析 XML 文檔的步驟如下: 創(chuàng)建 SAXParserFactory 的實(shí)例 創(chuàng)建 SAXParser 的實(shí)例 創(chuàng)建 SAXParserHandler 類 使用 parse() 方法解析 XML 文檔SAX解析演示o SaxXMLReader.java演示 SAX 最適用的情形 在需要解析大型文檔時(shí) 在只需一個(gè)信息子集時(shí) SAX 的缺點(diǎn)不能對文檔進(jìn)行隨機(jī)訪問只讀只遍歷文檔一

18、次JDOMp JDOM:Jason Hunter 和 Brett McLaughlin開發(fā)的項(xiàng)目,JDOM的設(shè)計(jì)目標(biāo)就是在讀和創(chuàng)建XML時(shí)簡化DOM,取代DOM。p 微軟的MSXML解析器:微軟已經(jīng)給我們提供了一個(gè)XML語法解析器,即一個(gè)叫做MSXML.DLL的動(dòng)態(tài)鏈接庫(C語言)jdom包的結(jié)構(gòu)包括:org.jdom包含了所有的xml文檔要素的java類org.jdom.adapters org.jdom.filter org.jdom.input包含了與dom適配的java類包含了xml文檔的過濾器類包含了讀取xml文檔的類包含了寫入xml文檔的類包含了將jdom xml文檔接口轉(zhuǎn)換為其o

19、rg.jdom.output org.jdom.transform 他xml文檔接口org.jdom.xpath包含了對xml文檔xpath操作的類DOM4JoDOM4J:一個(gè)易用的、開源的庫,用于XML,XPath和XSLT。它應(yīng)用于Java平臺(tái), 采用了Java集合框架并完全支持DOM, SAX和JAXP。DOM4J包的結(jié)構(gòu)包括:AttributeAttribute定義了XML的屬性Branch為能夠包含子節(jié)點(diǎn)的節(jié)點(diǎn)如XML元素(Element)和文Branch檔(Docuemnts)定義了一個(gè)公共的行為CDATACDATA 定義了XML CDATA 區(qū)域CharacterDataChar

20、acterData是一個(gè)標(biāo)識(shí)借口,標(biāo)識(shí)基于字符的節(jié)點(diǎn)。如CDATA,Comment, Text.CommentComment 定義了XML注釋的行為Document定義了XML文檔DocumentTypeDocumentType 定義XML DOCTYPE聲明ElementElement定義XML 元素ElementHandlerElementHandler定義了 Element 對象的處理器ElementPath被 ElementHandler 使用,用于取得當(dāng)前正在處理的路徑層次信息EntityEntity定義 XML entityDOM4J包的結(jié)構(gòu)包括:NodeNode為所有的dom4j

21、中XML節(jié)點(diǎn)定義了多態(tài)行為NodeFilterNodeFilter 定義了在dom4j節(jié)點(diǎn)中產(chǎn)生的一個(gè)濾鏡或謂詞的行為(predicate)ProcessingInstructionProcessingInstruction 定義 XML 處理指令.Text定義XML 文本節(jié)點(diǎn).VisitorVisitor 用于實(shí)現(xiàn)Visitor模式.XPathXPath 在分析一個(gè)字符串后會(huì)提供一個(gè)XPath 表達(dá)式 讀取并解析XML文檔:讀寫XML文檔主要依賴于org.dom4j.io包,其中提供DOMReader和SAXReader兩類不同方式,而調(diào)用方式是一樣的。這就是依靠接口的好處。/ 從文件讀取X

22、ML,輸入文件名,返回XML文檔public Document read(String fileName) throws MalformedURLException,DocumentException SAXReader reader = new SAXReader();Document document = reader.read(new File(fileName); return document; 取得Root節(jié)點(diǎn)public Element getRootElement(Document doc)return doc.getRootElement(); 遍歷XML樹DOM4J提供至少

23、3種遍歷節(jié)點(diǎn)的方法:1) 枚舉(Iterator)/ 枚舉所有子節(jié)點(diǎn)for ( Iterator i = root.elementIterator(); i.hasNext(); ) Element element = (Element) i.next();/ do something/ 枚舉名稱為foo的節(jié)點(diǎn)for ( Iterator i = root.elementIterator(foo); i.hasNext();) Element foo = (Element) i.next();/ do something/ 枚舉屬性for ( Iterator i = root.attribu

24、teIterator(); i.hasNext(); ) Attribute attribute = (Attribute) i.next();/ do something 遍歷XML樹2)遞歸遞歸也可以采用Iterator作為枚舉手段,但文檔中提供了另外的做法public void treeWalk() treeWalk(getRootElement();public void treeWalk(Element element) for (int i = 0, size = element.nodeCount(); i size; i+) Node node = element.node(i

25、);if (node instanceof Element) treeWalk(Element) node); else / do something. 遍歷XML樹3) Visitor模式了解設(shè)計(jì)模式的人都知道,Visitor是GOF設(shè)計(jì)模式之一。其主要原理就是兩種類互相保有對方的引用,并且一種作為Visitor去訪問許多Visitable。 我們來看DOM4J中的Visitor模式(快速文檔中沒有提供)只需要自定一個(gè)類實(shí)現(xiàn)Visitor接口即可。public class MyVisitor extends VisitorSupport public void visit(Element e

26、lement) System.out.println(element.getName();public void visit(Attribute attr) System.out.println(attr.getName();調(diào)用: root.accept(new MyVisitor()注意,這個(gè)Visitor是自動(dòng)遍歷所有子節(jié)點(diǎn)的。如果是 root.accept(MyVisitor),將遍歷子節(jié)點(diǎn)。我第一次用的時(shí)候,認(rèn)為是需 要自己遍歷,便在遞歸中調(diào)用Visitor,結(jié)果可想而知。4. 創(chuàng)建XMLpublic Document createDocument() Document docume

27、nt = DocumentHelper.createDocument(); Element root = document.addElement(root);Element author1 =root.addElement(author).addAttribute(name, James).addAttribute(location, UK).addText(James Strachan);Element author2 =root.addElement(author).addAttribute(name, Bob).addAttribute(location, US).addText(Bob

28、 McWhirter); return document;5. 文件輸出一個(gè)簡單的輸出方法是將一個(gè)Document或任何的Node通過write方法輸出FileWriter out = new FileWriter( foo.xml );document.write(out);美化輸出或縮減格式,可以用XMLWriter類public void write(Document document) throws IOException XMLWriter writer = new XMLWriter(new FileWriter( output.xml );writer.write( document );writer.close();/ 美化格式OutputFormat format = OutputF

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論