狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

SAX編程基礎

SAX編程基礎

更新時間:2024-04-11 文章作者:未知 信息來源:網絡 閱讀次數:

SAX編程入門

作者: 常明 寫作日期:2000-4-26



SAX其實就是(Simple Application interface for XML),這個接口規范是XML分析器和XML處理器提供的較XML更底層的接口。它能提供應用以較大的靈活性。

SAX誕生是在XML-DEV討論組上,提出它的原因是有一些情況不適用DOM接口,而且DOM實現太大而且比較慢。

SAX是一種事件驅動的接口,它的基本原理是,由接口的用戶提供符合定義的處理器,XML分析時遇到特定的事件,就去調用處理器中特定事件的處理函數。一般SAX都是JAVA的接口,但其實C++也可以用SAX接口,但C++的分析器比較少。

開發者主要關心的就是,如果我用一個SAX接口的XML分析器或處理器,我需要做些什么呢?那么,下面我們就看一下程序怎么寫吧!

SAX需要用戶提供一下幾個處理器類的實現:

DocumentHandlerXML:文件事件的處理器;

DTDHandler:DTD中事件的處理器;

ErrorHandler:出錯處理器。

寫程序就是以下這么幾步了:

首先需要從這幾個類繼承出自己的子類,
重載其中自己感興趣的事件的處理方法。
向分析器,注冊此處理器類,其實告訴分析器使用你的處理器。
啟動分析器。
下面是我抓來的一個例子(既然有現成的,自己寫好象比較浪費了:PP),這個例子中的PrettyPrint類就是一個繼承DocumentHandler的實現類,大家可以看到PrettyPrint選擇實現了開始元素、結束元素、字符數據、處理指令這樣幾個事件,最后的結果就是把以不同深度的縮進表示元素的層次的形式把XML輸出。

值得注意的是,在處理函數的參數中包含了與此事件相關的重要信息,處理函數其實就是對這些數據的處理。比如開始元素事件的參數中就會有元素名,屬性列表的信息。


void PrettyPrint::startElement(const XMLCh* constname AttributeList& attributes)
{
indent++; // A new element started, //it should be indented one
// level further than the current level
int i;
for(i = 0; i < indent; i++) outStrm << "\t";
outStrm << "<" << name;
unsigned int len = attributes.getLength();
for (unsigned int i = 0; i < len; i++)
{
outStrm << " " << attributes.getName(i) <<
"=\"" << attributes.getValue(i) <<
"\"";
}
outStrm << ">";
}

void PrettyPrint::endElement(const XMLCh* const name)
{ int i; for(i = 0; i < indent; i++)
outStrm << "\t"; outStrm << "</" <<
name << ">";
indent--;
}

void PrettyPrint::characters(const XMLCh* const chars, const unsigned int
length)
{
for (unsigned int index = 0; index < length; index++)
{
switch (chars[index])
{
 case chAmpersand : outStrm << "&"; break;
 case chOpenAngle : outStrm << "<"; break;
 case chCloseAngle: outStrm << ">"; break;
 case chDoubleQuote : outStrm << """; break;
 default: outStrm << chars[index];
break;
 }
}
}

void PrettyPrint::processingInstruction(const XMLCh* const target, const
XMLCh* const data)
{
int i; for(i = 0; i < indent; i++) outStrm << "\t";
outStrm << "<?" << target; if (data) outStrm
<< " " << data; outStrm << "?>\n";

}

看過這個例子,大家應該是比較清楚如何寫SAX的處理器了。具體的SAX接口可以在你要用的分析器的定義中找到,JAVA中就是interface或class,C++中可能就是類的定義。寫好以后就要調用Parser類的以下函數,將處理器設到parser內去:

public abstract void setDTDHandler (DTDHandler handler);
public abstract void setDocumentHandler (DocumentHandler handler);

public abstract void setErrorHandler (ErrorHandler handler);

...

此外SAX接口里有另外的幾個由分析器回調的處理器,他們的用法下面一一講一下:

InputSource:這個處理器的作用是控制XML文件的輸入,這樣輸入就可以有更多種選擇,可以來自文件系統,或Web服務器,甚至數據庫。

EntityResolver:解析外部實體用,分析器通過它得到外部實體。

Locator:定位器,作用是分析器用來在文件中定位的。作用之一就是報錯時能得到錯誤的位置。

這幾個的詳細用法,如果需要我以后會寫文章講細一些。

DOM也是XML的數據接口,讀到這里,有些讀者可能會問,SAX和DOM的關系是怎樣的呢? Don Park的SAXDOM實現了從SAX接口實現DOM模型,從這樣一個工具我們可以看出SAX是比DOM更低層的接 口,有了SAX,我們完全可以自己構造出DOM。DOM好用一些,為什么還要提出SAX呢?DOM模型的建立是分 析完整個XML文件后才能完成,對于某些特殊情況用DOM實現就不太現實,如XML文件特別大時,在內存建立 一棵它的DOM樹是不可想象的,還有當對于動態生成的XML,還沒有完成時,我們就需要知道里面有什么, 這時也不能用DOM。另外SAX運行很快,對于一些簡單的任務,用它效率比較高。所以DOM和SAX各有千秋, 可以在開發中互補。


溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
在线免费亚洲电影| 青青草97国产精品免费观看 | 加勒比av一区二区| aaa欧美色吧激情视频| 亚洲精品在线视频观看| 欧美日韩免费视频| 久久午夜羞羞影院免费观看| 亚洲精品va在线观看| 国产91精品一区二区| 99人久久精品视频最新地址| 91精品免费观看| 一区二区三区久久| 国产91丝袜在线18| 国产伦精品一区二区三区照片91 | 欧美一区二区在线| 色婷婷精品久久二区二区蜜臂av| 久久久精品日韩欧美| 丝袜美腿亚洲综合| 精品视频在线免费观看| 一区二区三区四区五区视频在线观看 | 国产一区二区三区在线观看精品| 欧美日韩在线精品| 欧美日韩dvd在线观看| 激情欧美一区二区三区| 在线观看成人av电影| 69久久夜色精品国产69蝌蚪网| 欧美成人国产一区二区| 性感美女极品91精品| 日本一区二区三区四区在线视频 | 欧美亚洲一区三区| 欧美日韩国产高清一区二区| 日韩视频在线永久播放| 欧美精品福利| 欧美电影一区二区| 欧美视频日韩视频在线观看| 久久久久久久电影| 国产凹凸在线观看一区二区| 久久久亚洲人| 香蕉乱码成人久久天堂爱免费| 国内外成人免费视频| 日韩午夜三级在线| 国产高清亚洲一区| 7777女厕盗摄久久久| 久久99久久精品| 在线观看日韩国产| 久久不见久久见免费视频7| 波多野结衣亚洲一区| 欧美一区二区精品久久911| 精品亚洲国内自在自线福利| 欧美天堂一区二区三区| 激情久久五月天| 26uuu国产电影一区二区| 成人av网站免费观看| 久久久久久9999| 91看片淫黄大片一级在线观看| 国产精品免费人成网站| 国产精品chinese| 欧美大白屁股肥臀xxxxxx| www.亚洲免费av| 国产精品免费久久| 国产精品永久| 国产乱子伦视频一区二区三区| 在线电影一区二区三区| 暴力调教一区二区三区| 中文字幕在线一区二区三区| 成人免费视频视频在线观看免费| 欧美一区精品| 欧美激情一二三区| 欧美日韩一区二区三区不卡| 色综合天天综合| 午夜精品123| 欧美一区二区网站| 免费日韩av片| 99热在线精品观看| 久久精品国内一区二区三区| 亚洲欧美二区三区| 亚洲图片激情小说| 中文字幕一区二区三区av| 欧美日韩一区精品| 久久岛国电影| 狠狠久久婷婷| 国产麻豆精品95视频| 亚洲一区二三区| 国产亚洲一区字幕| 欧美精品一区二区三| 久久久99久久精品欧美| 亚洲欧美激情诱惑| 99久久精品久久久久久清纯| 水蜜桃久久夜色精品一区的特点 | 国产精品视频yy9299一区| 欧美电影免费观看高清完整版在| 午夜在线一区二区| 国产精品www994| 成人av在线资源网| 风间由美性色一区二区三区| 激情图片小说一区| 三级久久三级久久| 在线成人小视频| 88在线观看91蜜桃国自产| 日韩欧美国产不卡| 欧美精品色一区二区三区| 亚洲日本欧美在线| 亚洲激情女人| 91国产免费观看| 91福利精品视频| 日韩精品影音先锋| 久久久精品国产99久久精品芒果| 国产欧美视频一区二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 国产精品久久久久毛片软件| 自拍偷拍欧美精品| 一区二区三区四区激情| 韩国女主播一区| 亚洲影音先锋| 国产精品女人毛片| 国产精品亚洲第一区在线暖暖韩国| 精品动漫一区| 精品人在线二区三区| 婷婷夜色潮精品综合在线| 欧美一区91| 91精品国产综合久久精品麻豆 | av影院午夜一区| 亚洲自拍高清| 久久综合久久综合亚洲| 午夜久久久久久久久久一区二区| 国产成人在线看| 日本高清视频一区二区| 久久久99久久精品欧美| 日韩av中文字幕一区二区 | 欧美一区二区三区视频免费 | 大桥未久av一区二区三区中文| 欧美视频一区二区三区| 日韩小视频在线观看专区| 欧美专区日韩专区| 国产女主播一区| 久久国产人妖系列| 亚洲午夜精品久久久久久浪潮| 日本高清不卡一区| 国产精品午夜春色av| 国产黑丝在线一区二区三区| 一区二区精品在线| 国产亚洲短视频| 成人免费看视频| 91麻豆精品91久久久久久清纯| 亚洲精品国产a久久久久久| 91免费观看视频在线| 欧美一区二区美女| 日本麻豆一区二区三区视频| 亚洲精品偷拍| 亚洲国产激情av| 成人午夜免费av| 欧美一区二区三区精品| 美女爽到高潮91| 久久午夜激情| 婷婷综合在线观看| 性欧美暴力猛交另类hd| 一二三区精品视频| 国产欧美日韩在线播放| 最好看的中文字幕久久| 欧美日本中文| 亚洲免费在线视频一区 二区| 好看的日韩av电影| 亚洲精品日韩综合观看成人91| 欧美呦呦网站| 亚洲三级视频在线观看| 一区二区冒白浆视频| 午夜国产不卡在线观看视频| 久久综合一区| 久久99久久久久久久久久久| 91精品国产综合久久国产大片| 狠狠色综合色综合网络| 欧美一区二区女人| 亚洲午夜精品国产| 丝袜诱惑亚洲看片| 日韩一区二区免费视频| 国产精品二区在线| 日本免费在线视频不卡一不卡二| 欧美三级视频在线观看 | 欧美在线视频二区| 亚洲一区在线视频| 日韩一区二区三区在线观看| 欧美人成在线| 美女网站一区二区| 国产精品亲子乱子伦xxxx裸| 国产欧美日韩综合一区在线播放 | 国产精品看片你懂得| 久久婷婷影院| 精品91久久久久| 精品一区二区免费看| 国产精品国产a| 欧美丰满一区二区免费视频| 国内精品久久久久久久影视蜜臀| 一区二区三区高清| 亚洲欧洲www| 精品国产成人系列| 在线看片欧美| 日本系列欧美系列| 国产清纯在线一区二区www| 国产精品一区二区在线观看| 麻豆精品一区二区|