<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 傻 瓜 閱讀(1573) 評(píng)論(0)  編輯  收藏 所屬分類: jaxp xml

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(7)

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

    隨筆分類

    隨筆檔案

    文章分類

    友情鏈接

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲欧洲自拍拍偷综合| 亚洲AV日韩AV永久无码久久| 亚洲一区二区三区在线网站 | 国产乱辈通伦影片在线播放亚洲| 亚洲精品成a人在线观看☆| 成人午夜免费福利| 香蕉视频亚洲一级| 国产精品亚洲美女久久久| 国产高清视频免费在线观看| 黑人大战亚洲人精品一区| 免费播放在线日本感人片| 亚洲欧洲在线观看| 两性刺激生活片免费视频| 亚洲国产日韩视频观看| 精品国产精品久久一区免费式| 国产成人亚洲精品电影| 久久青青草原亚洲av无码| 最近免费中文字幕中文高清| 亚洲精品韩国美女在线| 搡女人真爽免费视频大全| 免费人人潮人人爽一区二区 | 曰批视频免费30分钟成人| 亚洲码欧美码一区二区三区| 亚洲精品视频在线看| 日韩成人免费视频| 亚洲国产精品一区二区三区在线观看| 波多野结衣久久高清免费| 国产免费一级高清淫曰本片| 亚洲专区先锋影音| 麻豆国产人免费人成免费视频 | 亚洲欧洲国产成人精品| 国产成人青青热久免费精品| 国产精品免费αv视频| 亚洲日韩国产精品无码av| 又粗又硬又黄又爽的免费视频| 东方aⅴ免费观看久久av| 亚洲综合久久精品无码色欲| 国产亚洲精久久久久久无码77777| 亚洲电影免费观看| 国产亚洲精品久久久久秋霞| 一级毛片免费不卡直观看|