<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java隨記

    堅(jiān)持就是勝利!

     

    觀察者模式:從任意數(shù)據(jù)結(jié)構(gòu)生成XML解析器產(chǎn)生SAX事件

    在j2ee1.4標(biāo)準(zhǔn)教材里看到一個(gè)很有趣的例子,從任意數(shù)據(jù)結(jié)構(gòu)生成XML解析器產(chǎn)生SAX事件.數(shù)據(jù)結(jié)構(gòu)可以是文本文件,PDF格式文檔等.關(guān)鍵是自己解析這些數(shù)據(jù)源.另外一個(gè)有意思的地方是觀察者模式的應(yīng)用.所以就粗糙的改了一下并完整到可以測(cè)試運(yùn)行.觀察者模式簡(jiǎn)略UML圖:

    observer.jpg
    具體實(shí)現(xiàn) 被觀察者對(duì)象ParseXMLSubject類(lèi):
    package test;

    import java.io.*;
    import org.xml.sax.helpers.AttributesImpl;
    import org.xml.sax.*;

    public class ParseXMLSubject implements XMLReader {
    ??? ContentHandler handler;

    ??? String nsu = "";
    ??? Attributes atts = new AttributesImpl();
    ??? String rootElement = "addressbook";
    ??? String indent = "\n??? ";

    ??? public ParseXMLSubject(){

    ??? }

    ??? public ContentHandler getContentHandler() {
    ??????? return handler;
    ??? }

    ??? public void parse(InputSource input) throws IOException, SAXException {
    ??????? try {
    ??????????? // Get an efficient reader for the file
    ??????????? java.io.Reader r = input.getCharacterStream();
    ??????????? BufferedReader br = new BufferedReader(r);

    ??????????? // Read the file and display it's contents.
    ??????????? String line = br.readLine();

    ??????????? while (null != (line = br.readLine())) {
    ??????????????? if (line.startsWith("email:")) {
    ??????????????????? break;
    ??????????????? }
    ??????????? }

    ??????????? if (handler == null) {
    ??????????????? throw new SAXException("No content handler");
    ??????????? }

    ??????????? // Note:
    ??????????? // We're ignoring setDocumentLocator(), as well
    ??????????? handler.startDocument();
    ??????????? handler.startElement(nsu, rootElement, rootElement, atts);

    ??????????? output("email",? line);
    ??????????? line = br.readLine();
    ??????????? output("html", line);
    ??????????? line = br.readLine();
    ??????????? output("firstname",? line);
    ??????????? line = br.readLine();
    ??????????? output("lastname", line);
    ??????????? line = br.readLine();
    ??????????? output("work",? line);
    ??????????? line = br.readLine();
    ??????????? output("home", line);
    ??????????? line = br.readLine();
    ??????????? output("fax",? line);
    ??????????? line = br.readLine();
    ??????????? output("pager", line);
    ??????????? line = br.readLine();
    ??????????? output("cell",? line);
    ??????????? handler.ignorableWhitespace("\n".toCharArray(), 0, // start index
    ??????????????????????????????????????? 1 // length
    ??????????????????? );
    ??????????? handler.endElement(nsu, rootElement, rootElement);
    ??????????? handler.endDocument();
    ??????? } catch (Exception e) {
    ??????????? e.printStackTrace();
    ??????? }
    ??? }


    ??? public void parse(String systemId) throws IOException, SAXException {
    ??? }


    ??? public DTDHandler getDTDHandler() {
    ??????? return null;
    ??? }


    ??? public EntityResolver getEntityResolver() {
    ??????? return null;
    ??? }


    ??? public ErrorHandler getErrorHandler() {
    ??????? return null;
    ??? }


    ??? public boolean getFeature(String name) throws SAXNotRecognizedException,
    ??????????? SAXNotSupportedException {
    ??????? return false;
    ??? }


    ??? public Object getProperty(String name) throws SAXNotRecognizedException,
    ??????????? SAXNotSupportedException {
    ??????? return null;
    ??? }


    ??? public void setContentHandler(ContentHandler handler) {
    ??????? this.handler = handler;
    ??? }

    ??? public void setDTDHandler(DTDHandler handler) {
    ??? }


    ??? public void setEntityResolver(EntityResolver resolver) {
    ??? }


    ??? public void setErrorHandler(ErrorHandler handler) {
    ??? }


    ??? public void setFeature(String name, boolean value) throws
    ??????????? SAXNotRecognizedException, SAXNotSupportedException {
    ??? }


    ??? public void setProperty(String name, Object value) throws
    ??????????? SAXNotRecognizedException, SAXNotSupportedException {
    ??? }

    ??? void output(String name, String line) throws SAXException {
    ??????? int tmp = name.length();
    ??????? int startIndex=tmp+1;
    ??????? int textLength = line.length() - startIndex;
    ??????? String characters = line.substring(startIndex,line.length()-1);
    ??????? handler.ignorableWhitespace(indent.toCharArray(), 0, // start index
    ??????????????????????????????????? indent.length());
    ??????? handler.startElement(nsu, name, name /*"qName"*/, atts);

    ??????? handler.characters(characters.toCharArray(), startIndex, textLength);
    ??????? handler.endElement(nsu, name, name);
    ??? }

    }

    具體觀察者對(duì)象: ConcreateObserver類(lèi)
    package test;

    import org.xml.sax.helpers.DefaultHandler;
    import org.xml.sax.*;
    public class ConcreateObserver extends DefaultHandler {
    ??? public ConcreateObserver() {
    ??? }

    ??? public void startElement(String uri,
    ???????????????????????? String localName,
    ???????????????????????? String qName,
    ???????????????????????? Attributes attributes)
    ????????????????? throws SAXException{
    ????????????? System.out.println("startElement: "+localName);
    ????????? }
    ????????? public void characters(char[] ch,
    ???????????????????????????????? int start,
    ???????????????????????????????? int length)
    ??????????????? throws SAXException{
    ??????????? System.out.println("characters: ");
    ??????????? System.out.print(ch);
    ??????????? System.out.println();
    ??????? }
    }

    測(cè)試類(lèi):TestMain
    package test;
    import java.io.*;
    import org.xml.sax.InputSource;
    public class TestMain {
    ??? public TestMain() {
    ??? }

    ??? public static void main(String[] args) throws Exception {
    ??????? TestMain testmain = new TestMain();
    ??????? FileReader in = new FileReader(new File("d:\\AddressBookReaderLog01.txt"));

    ??????? ConcreateObserver observer=new ConcreateObserver();
    ??????? ParseXMLSubject parse = new ParseXMLSubject();
    ??????? parse.setContentHandler(observer);

    ??????? parse.parse(new InputSource(in));
    ??? }
    }

    測(cè)試文本文檔:AddressBookReaderLog01.txt

    AddressBookReader01 ../samples/PersonalAddressBook.ldif
    nickname: Fred
    email: fred@barneys.house
    html: TRUE
    firstname: Fred
    lastname: Flintstone
    work: 999-Quarry
    home: 999-BedrockLane
    fax: 888-Squawk
    pager: 777-pager
    cell: 555-cell

    另外一個(gè)也比較也有意思的地方就是具體觀察者類(lèi)從DefaultHandler 繼承,該類(lèi)是缺省適配器模式的應(yīng)用.
    歡迎加入QQ群:30406099?

    posted on 2006-08-07 09:16 傻 瓜 閱讀(1573) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): jaxp xml

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(7)

    我參與的團(tuán)隊(duì)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    友情鏈接

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产性爱在线观看亚洲黄色一级片| 久久精品免费一区二区| 国内自产少妇自拍区免费| 456亚洲人成影院在线观| 在线观看成人免费视频不卡| 亚洲一级高清在线中文字幕| 色se01短视频永久免费| 亚洲精品第一国产综合野| 久久久久久久91精品免费观看| 亚洲1区1区3区4区产品乱码芒果| 国产卡一卡二卡三免费入口| 最新国产成人亚洲精品影院| 成人免费福利电影| 欧美亚洲国产SUV| 亚洲欧洲久久久精品| 99久久99这里只有免费的精品| 国产午夜亚洲精品午夜鲁丝片| 成人免费av一区二区三区| 国产亚洲综合一区柠檬导航| 久久大香伊焦在人线免费| 亚洲国产精品日韩在线观看| 成人人观看的免费毛片| 在线观看亚洲免费| 亚洲人成无码网站| 日韩版码免费福利视频| 亚洲AV成人精品日韩一区| 亚洲裸男gv网站| 最近中文字幕免费完整| 亚洲一卡一卡二新区无人区| 亚洲欧洲国产成人综合在线观看| 国产精品免费无遮挡无码永久视频 | 国产日产亚洲系列| 99久久国产免费中文无字幕| 在线观看亚洲AV每日更新无码| 日本视频免费在线| 美女在线视频观看影院免费天天看| 精品亚洲成在人线AV无码| 亚洲国产成人久久一区WWW| 99久热只有精品视频免费看| 亚洲AV无码专区国产乱码不卡| 亚洲产国偷V产偷V自拍色戒|