<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類:
    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類
    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è)試類: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è)也比較也有意思的地方就是具體觀察者類從DefaultHandler 繼承,該類是缺省適配器模式的應(yīng)用.
    歡迎加入QQ群:30406099?

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


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(7)

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

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 久久久久久精品免费看SSS | 野花高清在线电影观看免费视频| 久久精品国产免费观看| 国产gv天堂亚洲国产gv刚刚碰 | 国产精品亚洲午夜一区二区三区 | 亚洲精品成人无限看| 在线精品亚洲一区二区 | 麻豆一区二区三区蜜桃免费| 免费一级毛片无毒不卡| 美女黄网站人色视频免费国产| 亚洲日韩精品A∨片无码| 亚洲av乱码中文一区二区三区| 久久久久久久岛国免费播放| 一本色道久久88综合亚洲精品高清| 亚洲国产综合专区电影在线| 免费国产va在线观看| 18禁成年无码免费网站无遮挡| 亚洲爆乳无码专区| 一级毛片免费观看不收费| 四虎成人免费影院网址| 亚洲成a人不卡在线观看| 成人爽a毛片免费| 久久久亚洲精品蜜桃臀| 色婷婷六月亚洲综合香蕉| 免费看一级做a爰片久久| 亚洲男人天堂2022| 国产成人免费手机在线观看视频| 中文字幕在线观看亚洲视频| 国产精品麻豆免费版| 国产福利免费视频| 亚洲伊人成无码综合网| 美国免费高清一级毛片| 在线观看视频免费国语| 成在线人直播免费视频| 免费看一级做a爰片久久| 青青操在线免费观看| 亚洲伊人久久精品影院| 99精品热线在线观看免费视频 | 亚洲午夜无码AV毛片久久| 亚洲精品免费视频| AV激情亚洲男人的天堂国语|