XML文檔定義分為DTD和Schema兩種形式,二者都是對XML語法的約束,其本質區(qū)別在于Schema本身也是一個XML文件,可以被XML解析器解析,而且可以為XML承載的數(shù)據(jù)定義類型,約束能力較之DTD更強大。對XML的解析主要有DOM(文檔對象模型,Document Object Model)、SAX(Simple API for XML)和StAX(Java 6中引入的新的解析XML的方式,Streaming API for XML),其中DOM處理大型文件時其性能下降的非常厲害,這個問題是由DOM樹結構占用的內存較多造成的,而且DOM解析方式必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問(典型的用空間換取時間的策略);SAX是事件驅動型的XML解析方式,它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發(fā)一個事件,用戶通過事件回調代碼來處理XML文件,適合對XML的順序訪問;顧名思義,StAX把重點放在流上,實際上StAX與其他解析方式的本質區(qū)別就在于應用程序能夠把XML作為一個事件流來處理。將XML作為一組事件來處理的想法并不新穎(SAX就是這樣做的),但不同之處在于StAX允許應用程序代碼把這些事件逐個拉出來,而不用提供在解析器方便時從解析器中接收事件的處理程序。
成都創(chuàng)新互聯(lián)公司專注骨干網(wǎng)絡服務器租用十載,服務更有保障!服務器租用,成都電信服務器托管 成都服務器租用,成都服務器托管,骨干網(wǎng)絡帶寬,享受低延遲,高速訪問。靈活、實現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務器。
打開.xml文件的時候,選擇"ES文本閱讀器"打開就可以了
.XML文件由于內容過于簡單僅僅是展示數(shù)據(jù)。所以通常作為文本的形式而存在。事實上這也真是XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同之處:他極其簡單。
這是一個看上去有點瑣細的優(yōu)點,但正是這點使XML與眾不同。 XML的簡單使其易于在任何應用程序中讀寫數(shù)據(jù)。而我們要打開.xml 文件時只需要通過閱讀器打開即可。
第一步:找到這個XML文件
第二步:選擇使用ES文本閱讀器打開
擴展資料:
在xml之前較為流行的文件格式為SGML,隨著時代的發(fā)展,人們對SGML進行了簡化衍生出HTML。HTML簡單,在初期沒有任何定義文檔外觀的相關方法,僅用來在瀏覽器里顯示網(wǎng)頁文件。而后,隨著因特網(wǎng)的發(fā)展,人們?yōu)榱丝刂破湮募邮?,擴充了描述如何顯現(xiàn)數(shù)據(jù)的卷標隨即發(fā)展為了XML。
簡要概述
關于視圖的解析過程。大概原理就是通過Layout Inf later的inflate方法,將一個xml布局文檔用pull遞歸解析。然后判斷標簽,如果是merge,include等特殊處理。如果是view或者view group,就通過xml的tag找到指定類,反射new出來,然后add到parent。這里值得一提的是,為了抑制反射造成的效率損失,對反射出來的constructor做了一個map靜態(tài)緩存,下次遇到了同名tag就不用反射了另外,xml從文件中預編譯獲取xml parser的過程也很復雜,在AssetManager有大量緩存(比如相同id的layout只獲取一次,緩存xml block)與native方法,都是為了保證效率。
Android中LayoutInflate解析xml布局文件生成View樹的過程
Android XML布局與View之間的轉換
XML (eXtensible Markup Language)即可擴展標記語言,它與HTML一樣,都是SGML(Standard Generalized Markup Language,標準通用標記語言)。Xml是Internet環(huán)境中跨平臺的,依賴于內容的技術,是當前處理結構化文檔信息的有力工具。擴展標記語言XML是一種簡單的數(shù)據(jù)存儲語言,使用一系列簡單的標記描述數(shù)據(jù),而這些標記可以用方便的方式建立,雖然XML占用的空間比二進制數(shù)據(jù)要占用更多的空間,但XML極其簡單易于掌握和使用。 XML與Access,Oracle和SQL Server等數(shù)據(jù)庫不同,數(shù)據(jù)庫提供了更強有力的數(shù)據(jù)存儲和分析能力,例如:數(shù)據(jù)索引、排序、查找、相關一致性等,XML僅僅是展示數(shù)據(jù)。事實上XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:他極其簡單。這是一個看上去有點瑣細的優(yōu)點,但正是這點使XML與眾不同。 XML與HTML的設計區(qū)別是:XML是用來存儲數(shù)據(jù)的,重在數(shù)據(jù)本身。而HTML是用來定義數(shù)據(jù)的,重在數(shù)據(jù)的顯示模式。 XML的簡單使其易于在任何應用程序中讀寫數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語言,雖然不同的應用軟件也支持其它的數(shù)據(jù)交換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows、Mac OS, Linux以及其他平臺下產(chǎn)生的信息結合,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結果。
Android解析xml文件總共有三種方法,分別是:
SAX解析XML文件:?SAX是一個解析速度快并且占用內存少的xml解析器,非常適合用于Android等移動設備。?SAX解析XML文件采用的是事件驅動,也就是說,它并不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發(fā)事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler接口。如下代碼:
public?static?ListPerson?readXML(InputStream?inStream)?{
try?{
//創(chuàng)建解析器
SAXParserFactory?spf?=?SAXParserFactory.newInstance();
SAXParser?saxParser?=?spf.newSAXParser();
//設置解析器的相關特性,true表示開啟命名空間特性
saxParser.setProperty("",true);
XMLContentHandler?handler?=?new?XMLContentHandler();
saxParser.parse(inStream,?handler);
inStream.close();
return?handler.getPersons();
}?catch?(Exception?e)?{
e.printStackTrace();
}
return?null;
}
//SAX類:DefaultHandler,它實現(xiàn)了ContentHandler接口。在實現(xiàn)的時候,只需要繼承該類,重載相應的方法即可。
public?class?XMLContentHandler?extends?DefaultHandler?{
private?ListPerson?persons?=?null;
private?Person?currentPerson;
private?String?tagName?=?null;//當前解析的元素標簽
public?ListPerson?getPersons()?{
return?persons;
}
//接收文檔開始的通知。當遇到文檔的開頭的時候,調用這個方法,可以在其中做一些預處理的工作。
@Override
public?void?startDocument()?throws?SAXException?{
persons?=?new?ArrayListPerson();
}
//接收元素開始的通知。當讀到一個開始標簽的時候,會觸發(fā)這個方法。其中namespaceURI表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);qName表示元素的限定名(帶前綴);atts?表示元素的屬性集合
@Override
public?void?startElement(String?namespaceURI,?String?localName,?String?qName,?Attributes?atts)?throws?SAXException?{
if(localName.equals("person")){
currentPerson?=?new?Person();
currentPerson.setId(Integer.parseInt(atts.getValue("id")));
}
this.tagName?=?localName;
}
//接收字符數(shù)據(jù)的通知。該方法用來處理在XML文件中讀到的內容,第一個參數(shù)用于存放文件的內容,
//后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用new?String(ch,start,length)就可以獲取內容。
@Override
public?void?characters(char[]?ch,?int?start,?int?length)?throws?SAXException?{
if(tagName!=null){
String?data?=?new?String(ch,?start,?length);
if(tagName.equals("name")){
this.currentPerson.setName(data);
}else?if(tagName.equals("age")){
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
//接收文檔的結尾的通知。在遇到結束標簽的時候,調用這個方法。其中,uri表示元素的命名空間;
//localName表示元素的本地名稱(不帶前綴);name表示元素的限定名(帶前綴)
@Override
public?void?endElement(String?uri,?String?localName,?String?name)?throws?SAXException?{
if(localName.equals("person")){
persons.add(currentPerson);
currentPerson?=?null;
}
this.tagName?=?null;
}
}
DOM解析XML文件:? DOM解析XML文件時,會將XML文件的所有內容讀取到內存中,然后允許您使用DOM API遍歷XML樹、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來比較直觀,并且,在某些方面比基于SAX的實現(xiàn)更加簡單。但是,因為DOM需要將XML文件的所有內容讀取到內存中,所以內存的消耗比較大,特別對于運行Android的移動設備來說,因為設備的資源比較寶貴,所以建議還是采用SAX來解析XML文件,當然,如果XML文件的內容比較小采用DOM是可行的。
Pull解析器解析XML文件:? ? Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結束元素事件,使用parser.next()可以進入下一個元素并觸發(fā)相應事件。事件將作為數(shù)值代碼被發(fā)送,因此可以使用一個switch對感興趣的事件進行處理。當元素開始解析時,調用parser.nextText()方法可以獲取下一個Text類型元素的值
PULL解析器,因為SAX解析器操作起來太笨重,DOM不適合文檔較大,內存較小的場景,唯有PULL輕巧靈活,速度快,占用內存小,使用非常順手。
在Android中,常見的XML解析器分別為SAX解析器、DOM解析器和PULL解析器,下面一一詳細介紹。
1、SAX解析器:
SAX(Simple
API
for
XML)解析器是一種基于事件的解析器,它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產(chǎn)生事件后,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態(tài)信息,這樣事件處理器才能夠根據(jù)提供的事件信息來決定自己的行為。
SAX解析器的優(yōu)點是解析速度快,占用內存少。非常適合在Android移動設備中使用。
2、DOM解析器:
DOM是基于樹形結構的的節(jié)點或信息片段的集合,允許開發(fā)人員使用DOM
API遍歷XML樹、檢索所需數(shù)據(jù)。分析該結構通常需要加載整個文檔和構造樹形結構,然后才可以檢索和更新節(jié)點信息。
由于DOM在內存中以樹形結構存放,因此檢索和更新效率會更高。但是對于特別大的文檔,解析和加載整個文檔將會很耗資源。
3、PULL解析器:
PULL解析器的運行方式和SAX類似,都是基于事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產(chǎn)生的事件然后做相應的操作,而不像SAX那樣由處理器觸發(fā)一種事件的方法,執(zhí)行我們的代碼。PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統(tǒng)內部在解析各種XML時也是用PULL解析器。