糯米文學吧

位置:首頁 > 設計 > 網頁設計

關於XML的介紹

什麼是XML?XML介紹

關於XML的介紹

什麼是XML?XML 開發者們會告訴你,事實上XML並不是一種語言,而是一種用來定義其它語言的系統。可能你已經聽過,或許甚至自己嘗試過一些這樣的語言??比如微軟為推(push)技術所推出的頻道定義格式(Channel Definition Format)。W3C是互連網上一些公用標準的開發者,他推出了一系列和XML相關的標準和草案。他們把XML描敍成“一種用來表達結構化數據的通用語法”。所謂結構化數據是指被標籤(tags)定義了其內容,意義和用法的數據。例如,在HTML的定義中,標籤所定義的文本,將會用一種特定的字體和大小所顯示出來。一個XML標籤會明確的確定一種信息: 標籤可能表示的是文檔的作者,而則可能包含了產品的價格。與HTML中標籤所不同的是:XML標籤的含義是自定義的,如果你願意,可以用來表示作者信息,而用來表示產品價格。雖然這看起來會很彆扭,但絕對是正確的。通過分離結構和數據,一份XML文檔能夠一經寫出,就能應用在多種不同的用途:在計算機屏幕上顯示出來,或者顯示在手機屏幕上,又或者被轉到為盲人設計的語音設備上,等等,諸多功用,不一而足。它幾乎能夠工作在任何可能的通訊設備上。這時候,一個XML文檔的作用,已經遠遠超出了當初你所以為的那樣,僅僅是用來顯示內容的簡單文檔了。這樣,XML就能夠在除了互連網的其它地方也能夠一展身手。在一些大型的文檔製作商中,SGML是他們用了很多年的語言,但是它實在是太複雜了,僅僅是定義就有400多頁。XML的出現也為他們創造了一些契機。事實上XML是SGML的一個精簡了的子集,SGML的大部分工作都可以由XML來完成,而XML比起SGML來卻是簡單了許多。當然,平台無關的XML最初是為Web所設計的,它也將在在Web上產生最大的影響。DOM(Domument Object Model)是一個編程接口,他定義了在一個文檔中如何進行數據存取的機制。XML能夠為Web所做的,很大程度上取決於它是如何同DOM(文檔對象模型)進行交互。使用DOM,程序員可以用一種標準的方法來動態的操作文檔的內容和相關的一些屬性。換句話説,程序員可以讓在一個瀏覽器的文檔對象樹中的一段內容進行一些特定的動作。例如:當把鼠標移到一小段文字上面時,它會改變顏色。網景的Navigator和微軟 Internet Explorer都定義了個不相容的DOM,但是這兩個公司都宣佈在他們下一個版本的瀏覽器中會支持W3C的標準DOM。這會給程序員帶來很多的方便。

什麼是XML?列舉一下你所瞭解的XML技術及其應用

答:XML即可擴展標記語言。eXtensibleMarkupLanguage.標記是指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種信息的文章等。如何定義這些標記,即可以選擇國際通用的標記語言,比如HTML,也可以使用象XML這樣由相關人士自由決定的標記語言,這就是語言的可擴展性。XML是從SGML中簡化修改出來的。它主要用到的有XML、XSL和XPath等。

Android 創建與解析XML(一)—— 概述Android 創建與解析XML(一)—— 概述

Android 是最常用的智能手機平台,XML 是數據交換的標準媒介,Android 中可以使用標準的XML生成器、解析器、轉換器 API,對 XML 進行解析和轉換。

XML,相關有DOM、SAX、JDOM、DOM4J、Xerces、JAXP等一堆概念,但是很多人總是會弄混他們之間的關係,這對我們理解XML文件的創建和解析很不利。要挑選一個適合在Android平台上使用的XML解析方案,我們還是得先把這些概念釐清。

XML基本概念DOM(Document Object Model,文檔對象模型)和SAX(Simple API for XML,簡單XML應用接口),是JAXP(Java API for XML Processing,Java XML處理的應用接口)定義的2種不同的對XML文檔進行分析、處理的方法。

DOM方法是用標準對象模型表示 XML 文檔;SAX方法則使用事件模型來處理程序來處理XML。

JAXP完成了對SAX、DOM的包裝,它嚮應用程序提供針對DOM的DocumentBuilderFactory、 DocumentBuilder;以及針對SAX的SAXParserFactory、SAXParser抽象工廠類。在Jave SE中JAXP對應ers包,DOM對應,SAX對應。

Xerces首先繼承並實現了er包內的SAXParser、SAXParserFactory、DocumentBuilder、DocumentBuilderFactory等抽象類,並提供了JAXP中所定義的DOM、SAX(以及StAX,後面會介紹)這些XML解析方法的實現和相應的Parser。JDOM和DOM4J,是因為有人覺得W3C的DOM標準API太過難用而着手開發的替代API,它們和JAXP一樣都是對DOM、SAX的封裝,不過JDOM、DOM4J做了更多的事情,相當於上面提到JAXP接口+Xerces DOM實現部分。JDOM並沒有自己開發Parser,所以還是需要利用Xerces的Parser部分,而DOM4J自帶一個名為Alfred2的Parser,當然也可以使用Xerces的Parser。看起來JAXP具備更好的`可移植性,即我們可以通過修改配置文件切換不同的DOM實現和SAX、DOM Parser,JDOM、DOM4J雖然也可以切換Parser,但是DOM實現是無法切換的。(參考: Java XML API 漫談 和 JAXP全面介紹)

XML創建與解析

XML創建主要四種方式:Dom、Sax、Pull、Dom4j

XML解析主要四種方式:Dom、Sax、Pull、Dom4j

其中,利用Dom、Sax、Pull、Dom4j創建的標準XML格式文件,可以由任何一種Dom、Sax、Pull、Dom4j解析方式進行解析。

Android中解析XML

DOM解析器,是通過將XML文檔解析成樹狀模型並將其放入內存來完成解析工作的,然後對文檔的操作都是在這個樹狀模型上完成的。這個在內存中的文檔樹將是文檔實際大小的幾倍。這樣做的好處是結構清晰、操作方便,而帶來的麻煩就是極其耗費系統資源。SAX解析器,正好克服了DOM的缺點,分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中,這對於大型文檔來説是個巨大的優點。事實上,應用程序甚至不必解析整個文檔,它可以在某個條件得到滿足時停止解析。

DOM與SAX比較

下面的表格列出了SAX和DOM在一些方面的對照:

SAXDOM順序讀入文檔併產生相應事件,可以處理任何大小的XML文檔在內存中創建文檔樹,不適於處理大型XML文檔。只能對文檔按順序解析一遍,不支持對文檔的隨意訪問。可以隨意訪問文檔樹的任何部分,沒有次數限制。只能讀取XML文檔內容,而不能修改可以隨意修改文檔樹,從而修改XML文檔。開發上比較複雜,需要自己來實現事件處理器。易於理解,易於開發。對開發人員而言更靈活,可以用SAX創建自己的XML對象模型。已經在DOM基礎之上創建好了文檔樹。通過對SAX和DOM的分析,它們各有自己的不同應用領域:

SAX適於處理下面的問題:對大型文檔進行處理。只需要文檔的部分內容,或者只需要從文檔中得到特定信息。想創建自己的對象模型的時候。DOM適於處理下面的問題:

需要對文檔進行修改需要隨機對文檔進行訪問,例如XSLT解析器。

DOM和SAX的應用場景

1、數據修改:如果打算對數據作出更改並將它輸出為 XML,那麼在大多數情況下,DOM 是適當的選擇。並不是説使用 SAX 就不能更改數據,但是該過程要複雜得多,因為您必須對數據的一份拷貝而不是對數據本身作出更改。

2、數據容量: 對於大型文件,SAX 是更好的選擇。

3、數據使用:如果只有數據中的少量部分會被使用,那麼使用 SAX 來將該部分數據提取到應用程序中可能更好。 另一方面,如果您知道自己以後會回頭引用已處理過的大量信息,那麼 SAX 也許不是恰當的選擇。

4、速度要求: SAX 實現通常要比 DOM 實現速度更快。基於上面的分析,在基於Android系統的內存和CPU資源比較有限的手持設備上,只要我們不需要修改XML數據或者隨機的訪問XML數據,SAX儘管可能需要更多的編碼工作,但是為了更小的內存和CPU消耗,還是值得的。另外,Android SDK中已經包含了JAXP對應的ers包,SAX對應,DOM對應的包,加上Android還提供了這樣的包來方便SAX Handle的開發,基於JAXP和SAX這樣的標準方法來開發不僅複雜度不高,即使出現問題在討論組中尋求解決方案也是比較容易的。(參考: 使用 SAX 處理 XML 文檔 和 DOM SAX JAXP DOM4J JDOM xerces解析器)Android中解析XML實現

基於上面的分析,採用JAXP+SAX的方案是我比較看好的。我們首先需要又一個SAXParserFactory的實例,然後從工廠中得到一個SAXParser實例,進而獲取一個XMLReader;接下來新建一個Handler類繼承自SAX Helpler的DefaultHandler,並實現startDocument()、startElement()、endElement()以及endDocument()等方法,並把這個Handler作為XMLReader的Content Handler;最後以帶解析的XML文檔為參數調用XMLReader的parse方法即可。具體的代碼參考:Android 上使用 XML 和 Android 3.0 平台上創建和解析 XML

1、Android系統中的DOM和SAX實現Android SDK中包含了JAXP對應ers包,SAX對應的,DOM對應的包,所以我們就已經有了XML解析所需的JAXP——對SAX和DOM的封裝(抽象類)以及SAX和DOM接口類,但是對於JAXP抽象類的實現,以及DOM和SAX接口類的實現在哪裏呢?是和Java SE 5.0一樣用了Xerces嗎? 不!通過查看Android 1.5的源代碼,我看到這部分的代碼來自Apache Harmony這個開源的Java SE實現,位於./dalvik/libcore/xml/src/main/java/org/apache/harmony/xml目錄。這裏包含有一個完整的DOM實現(dom目錄),對於er下的抽象類的實現(parser目錄),以及對於SAX接口類的實現(除此以外還包括對XMLPullParser接口的實現)。2、XmlPull 和 KXML2XmlPull解析器,提供了資源有限的環境(如J2ME)應用使用的XML解析API,XPP提供了非常簡單的接口——包含一個接口、一個異常、一個建立解析器的factory。它採用了類似JAXP的工廠模式,把接口設計和實現分離,KXML2就是一個為J2ME環境優化的一個實現。在Android SDK中,已經包含了XmlPull(ull.v1包)以及它的一個AddOn——SAX2 Driver——它使得我們可以通過SAX2的API來操縱XmlPull Parser。另外,通過sourcecode,我們可以看到Android SDK中的XmlPull的實現是KXML2,位於./dalvik/libcore/xml/src/main/java/org/kxml2目錄。Apache Harmony的目錄中同樣有一個ExpatPullParser類實現了XMLPullParser接口,但是卻沒有XmlSerializer接口的實現,所以只能説Android中的Harmony也部分實現了XmlPull API。XmlPull+KXML2是下一步我要實踐的方案,到時候還得學習一下如何“公平”的比較兩者的性能。3、StAX儘管Android中還沒有提供相應的支持,但是Streaming API for XML (StAX) 作為用Java語言處理 XML的最新標準,無論從性能還是可用性上都有出色的表現。它不僅提供了一個快捷、易用、佔用內存少的 XML 解析器,它還提供了過濾器接口,允許程序員嚮應用程序業務邏輯隱藏不需要的文檔細節。感興趣的朋友可以看一看下面的文章。

使用 StAX 解析 XML,第 1 部分: Streaming API for XML (StAX) 簡介

使用 StAX 解析 XML,第 2 部分: 拉式解析和事件

使用 StAX 解析 XML,第 3 部分: 使用定製事件和編寫 XML

XML的國際化問題

XML的國際化問題XML的出現,使得網站的國際化變得空前的容易。和Java一樣,XML也是使用的Unicode(ISO 10646)作為其編碼標準,這是的網站建設者們能夠很容易的寫出各國的文字和符號,而不必過多的擔心亂碼的問題。Unicode 包括了所有的ASCII字符,以及簡體中文,繁體中文,日文,韓文,希臘文等等。在XML中甚至可以允許有混合的編碼出現,例如,一個顯示中文的網頁可以引用一個德文的單詞,而不必擔心出現亂碼。開發者不需要專門為了Unicode而在去學習什麼新的東西,網頁一經寫好後,在客户端的瀏覽器中顯示時,瀏覽器會自動的使用合適的字符集把網頁顯示出來。

XML對於超鏈接有那些改進?

XML對於超鏈接有那些改進?XML對HTML的超鏈接做了一些改進,增加了一些特性,包括能夠建立“智能”鏈接,可以省去不少手工編寫JavsScript的麻煩。在XML中,鏈接是作為一個對象出現的,可以向操作任何的其它對象那樣,對超鏈接進行方便的操作。原來的關於鏈接的的標準??XLL,XML鏈接語言(XML Linking Language)現在被分為兩種新的標準:Xpointer和nter:在HTML中,可以通過書籤鏈接到一個頁面的任何地方。通過Xpointer你將能夠“尋址到(address to)”(而不是“鏈接到(link to)”)其他頁面的任何一部分的內容。顯然的,這對於在文檔引用方面是非常有用的。Xlink:當用户點擊了HTML中的一個超鏈接後,當前的網頁被一個新的網頁所替代。Xlink能夠讓Web開發者為鏈接這個對象添加一些動作(behaviors)。例如:在現在你必須用JavaScript來實現把鏈接的網頁在一個新的窗口中顯示出來,但Xlink通過給鏈接對象添加了一些行為,實現彈出窗口容易到只是簡單的調用對象的方法而已。其他的一些有用的應用,像彈出的警告對話框,需要用户做出確認的對話框等等,通過Xlink的對象機制都可以很容易地實現。但現在,我們還都必須求助於腳本編程採能夠解決。對於一系列相關的鏈接,XML能夠讓Web開發者創建擴展鏈接(Extended Links)來方便的實現像這樣的網站或網頁,把一些相同主題的網頁自動的鏈接在一起。現在實現這個功能需要使用到CGI腳本,但是擴展鏈接將提供標準的方法來建立資源之間的關聯。現在還有一些問題需要得到進一步的討論,特別是在“行為”機制方面還有一些工作要作。但這並不妨礙在不久的將來,Xpinter和Xlink作為新的標準被廣泛使用。

標籤:XML