saxを使用してXMLファイルを解析するDefaultHandler処理クラスについて説明する

私は千年の歳月をかけて、数え切れないほどの時代の幕を開けました。穏やかで水っぽい日に会うために、そして生涯、生涯、美しい散文のために、お互いに親しくなりました。 「アンドロイドとして;)、xmlファイルを解析するためにsaxを使用することは、xmlを解析するために私が見た最も簡単な方法です。

Javaコード
SAXParserFactoryファクトリ= SAXParserFactory.newInstance();    
SAXParserパーサー = factory.newSAXParser();    
XMLReader xmlReader = parser.getXMLReader();    
xmlReader.setContentHandler(mRSSHandler);    
xmlReader.parse(new InputSource(mStream));  

          ここで説明するのは、saxで使用されるファクトリデザインパターンです。パーサーはSAXParserFactoryを通じて取得され、xmlファイルを解析するxmlReaderはパーサーから取得されます。ただし、xmlReaderがストリーミングxmlファイルを読み取るときは、RSSHandlerの設定を完了する必要があります。 RSSHandlerは継承されたDefaultHandlerであるため、この記事では、saxを使用してxmlファイルを解析するDefaultHandler処理クラスの説明に焦点を当てます。ここでは、Webサイトのrss.xmlファイルの解析を例にとります。まず、rss.xmlのファイル形式を見てみましょう。

XML/HTML代码
コードをコピー
<?xml version = "1.0" encoding = "utf-8" ?>        
< rss version = "2.0" >       
< チャネル>       
< アイテム>       
< タイトル> Ubuntu11.04(10.04)安装dosツールdosemu </ タイトル>        
< リンク> http ://www.ourunix.org/post/276.html </ link >        
< author > [email protected](walfred)</ author >        
< category >玩转Linux </ category >        
<2012年1月16日月曜日22:54:53 +0800 </ pubDate >        
< コメント/>        
< 説明> 概要読んだ、これはLinuxのようなワインの後のwinツールであることがわかりました。 ubuntu Linuxでのインストール手順とそれを使用してDOSゲームを実行する:反対~~~ </ 説明>        
</ アイテム>       
</ チャンネル>       
</ rss >   
コードをコピー

       R SSHandlerによって継承されたDefaultHandler処理クラスは、このファイルを解析するように特別に設計されています。完了する必要があるインターフェースを見てみましょう。

コードをコピー
public  void startDocument(){  
         // ドキュメントの解析開始   
    }   
  
    public  void endDocument(){  
         // ドキュメントの解析終了   
    }   
  
    public  void startElement(String uri、String localName、String qName、Attributes attributes){  
         // 解析ノードの開始   
    }   
      
    public  void文字(char [] ch、int start、int length){  
         // ノードのコンテンツを保存   
    }   
      
    public  void endElement(String uri、String localName、String qName){  
         //ノードの解析を終了します   
    }  
コードをコピー

         一般前两个方法,开始解析和结束解析文档的不需要做处理外,我们的所有操作都是在解析节点部分,我们调用startElement 开始解析节点,然后调用characters 保存节点的内容,最后调用endElement ,如此循环而已,可以看下解析rss的示例:

コードをコピー
public class RSSHandler extends DefaultHandler {  
    private Context mContext;  
    private RSSItem mRSSItem;  
    private RSSDBInterface mRSSDBInterface;  
      
    private final int TITLE_STATE = 1;  
    private final int AUTHOR_STATE = 2;  
    private final int LINK_STATE = 3;  
    private final int DESCRIPTION_STATE = 4;  
    private final int CATEGORY_STATE = 5;  
    private final int PUBDATE_STATE = 6;  
      
    //标记当前节点  
    private int currentState;  
      
    public RSSHandler(Context ctx){  
        mContext = ctx;  
        //初始化当前节点标记为0  
        currentState = 0;  
        //数据库接口  
        mRSSDBInterface = new RSSDBInterface(mContext);  
    }  
      
    public void startDocument () {  
        //开始解析文档  
        mRSSItem = new RSSItem();
    }  
  
    public void endDocument () {  
        //文档解析结束  
    }  
  
    public void startElement (String uri, String localName, String qName, Attributes attributes) {  
        //开始解析节点  
        if (localName.equals("channel")){  
            return ;  
        }  
          
        if (localName.equals("item")){  
            //当遇到一个item节点时,就实例化一个RSSItem对象  
            mRSSItem = new RSSItem();  
            return;  
        }  
          
        if (localName.equals("title")){  
            currentState = TITLE_STATE;  
            return ;  
        }  
          
        if (localName.equals("author")){  
            currentState = AUTHOR_STATE;  
            return ;  
        }  
          
        if (localName.equals("description")){  
            currentState = DESCRIPTION_STATE;  
            return ;  
        }  
          
        if (localName.equals("link")){  
            currentState = LINK_STATE;  
            return ;  
        }  
          
        if (localName.equals("category")){  
            currentState = CATEGORY_STATE;  
            return ;  
        }  
          
        if (localName.equals("pubDate")){  
            currentState = PUBDATE_STATE;  
            return ;  
        }  
    }  
      
    public void endElement (String uri, String localName, String qName) {  
        //这是节点解析完成时调用的,这里我们遇到item的时候才调用下面的  
        if(localName.equals("item" && mRSSItem != null)){  
            ContentValues values = new ContentValues();  
            values.put(RSSDBInfo.Columns._TITLE, mRSSItem.getTitle());  
            values.put(RSSDBInfo.Columns._AUTHOR, mRSSItem.getAuthor());  
            values.put(RSSDBInfo.Columns._CATEGORY, mRSSItem.getCategory());  
            values.put(RSSDBInfo.Columns._DESCRIPTION, mRSSItem.getDescription());  
            values.put(RSSDBInfo.Columns._LINK, mRSSItem.getLink());  
            values.put(RSSDBInfo.Columns._PUBDATE, mRSSItem.getPubdate());  
            values.put(RSSDBInfo.Columns._ISREAD, RSSUtils.ARTICALE_UNREAD);  
            mRSSDBInterface.insertRSStoDB(values);  
        }  
    }  
      
    public void characters (char[] ch, int start, int length) {  
        String theString = new String(ch, start, length);  
        switch(currentState){  
        case TITLE_STATE:  
            mRSSItem.setTitle(theString);  
            currentState = 0;  
            break;  
              
        case AUTHOR_STATE:  
            mRSSItem.setAuthor(theString);  
            currentState = 0;  
            break;  
              
        case LINK_STATE:  
            mRSSItem.setLink(theString);  
            currentState = 0;  
            break;  
              
        ケースDESCRIPTION_STATE:   
            mRSSItem.setDescription(theString);  
            currentState = 0 ;  
            休憩;  
              
        ケースCATEGORY_STATE:   
            mRSSItem.setCategory(theString);  
            currentState = 0 ;  
            休憩;  
              
        ケースPUBDATE_STATE:   
            mRSSItem.setPubdate(theString);  
            currentState = 0 ;  
            休憩;  
        }   
    }  

}

転載:http://www.cnblogs.com/chenying99/archive/2013/05/14/3077014.html

おすすめ

転載: blog.csdn.net/xifei66/article/details/54893806