XML
可擴(kuò)展標(biāo)記語(yǔ)言,XML的設(shè)計(jì)宗旨是傳輸和存儲(chǔ)數(shù)據(jù),HTML用來(lái)顯示數(shù)據(jù),焦點(diǎn)是數(shù)據(jù)的外觀
web方面優(yōu)點(diǎn):
XML把數(shù)據(jù)從HTML分離
XML簡(jiǎn)化數(shù)據(jù)共享
XML簡(jiǎn)化數(shù)據(jù)傳輸
XML簡(jiǎn)化平臺(tái)的變更
XML使數(shù)據(jù)更有用
XML文檔組成:
1.XML聲明
<? xml 版本信息 [編碼信息] [文檔獨(dú)立性信息] ?>
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
2.XML文檔類(lèi)型聲明,兩種形式
聲明DTD在一個(gè)外部文件中,是以.dtd為擴(kuò)展名的文本文件
<!DOCTYPE 根元素 SYSTEM"文件名">
<!DOCTYPE poem SYSTEM "c.dtd">
直接在XML文檔中給出DTD,形式為
<!DOCTYPE 根元素 [元素聲明]>
<!DOCTYPE poem [
<!ELEMENT poem (title, author, content)>
<!ELEMENT title (#PCDATA)>
xxxx
3.元素
4.XML注釋
5.XML處理指令
<? target instruction?>
解析XML的三種方式
DOM:會(huì)將XML文件的所有內(nèi)容以文檔樹(shù)的方式存放在內(nèi)存中,允許用戶使用DOMAPI遍歷XML樹(shù),檢索所需的數(shù)據(jù)
基本流程:
1.利用DocumentBuilderFactory創(chuàng)建一個(gè)DocumentBuilderFactory實(shí)例
2.利用DocumentBuilderFactory創(chuàng)建DocumentBuilder
3.加載XML文檔(Document)
4.獲取文檔的根節(jié)點(diǎn)(Element)
5.獲取根節(jié)點(diǎn)中所有子節(jié)點(diǎn)的 列表(NodeList)
6.獲取子節(jié)點(diǎn)列表中的需要讀取的節(jié)點(diǎn)
SAX解析XML
基于事件驅(qū)動(dòng),邊加載邊解析
基本流程:
1.創(chuàng)建SAXParseFactory對(duì)象
2.根據(jù)SAXParserFactory.newSAXParser()方法返回一個(gè)SAXParser解析器
3.根據(jù)SAXParser解析器獲取事件源對(duì)象XMLReader
4.實(shí)例化一個(gè)DefaultHandler對(duì)象
5.連接事件源對(duì)象XMLReader到時(shí)間處理類(lèi)DefaultHandler中(setContentHandler)
6.調(diào)用XMLReader的parse方法從輸入源中獲取的XML數(shù)據(jù)
7.通過(guò)DefaultHandler返回需要的數(shù)據(jù)集合
PULL解析XML
方式與SAX解析一樣碌更,基于事件驅(qū)動(dòng)
XmlPullParserFactory factory;
//實(shí)例化XmlPullParserFactory
factory = XmlPullParserFactory.newInstance();
//設(shè)置支持名稱(chēng)空間
factory.setNamesapceAware(true);
//創(chuàng)建XmlPullParser類(lèi)
XmlPullParser xpp = factory.newPullParser();
//將xml文本讀入XmlPullParser解析器
xpp.setInput(new StringReader("<poem lang=\"chinese\"><title>靜夜思</title><author>李白</author><content>床前明月光....</content></poem>"));
//定義pull解析常用事件類(lèi)型
int eventType = xpp.getEventType();
//查看是否為XML文檔的邏輯末尾曾撤,輸入流的末尾
while(eventType != XmlPullParser.END_DOCUMENT) {
//查看是否為文檔開(kāi)始類(lèi)型
if(eventType == XmlPullParser.START_DOCUMENT) {
Log.d(TAG,"start document");
}else if (eventTpe == XmlPullParser.START_TAG) {
//是否XML標(biāo)簽的開(kāi)始
Log.d(TAG,"start tag" + xpp.getName());
} else if(eventType == XmlPullParser.END_TAG) {
//是否XML標(biāo)簽的結(jié)束
Log.d(TAG,"End tag" + xpp.getName());
} else if(eventType == XmlPullParser.TEXT) {
//是否XML的文本內(nèi)容
Log.d(TAG,"Text " + xpp.getText());
}
//獲取下個(gè)解析事件
eventType = xpp.next();