Android XML讀寫(四)
如示例所示,一個 de >ITEMde > 對應于一個 de >Messagede > 實例。項目的子節點(de >TITLEde >、de >LINKde > 等)對應于 de >Messagede > 實例的屬性。現在,您已經對提要有了一定的認識,并且已經創建了所有常用部分,接下來看看如何使用 Android 上可用的各種技術來解析這個提要。您將從 SAX 開始。
使用 SAX
在 Java 環境中,當您需要一個速度快的解析器并且希望***限度減少應用程序的內存占用時,通常可以使用 SAX API。這非常適用于運行 Android 的移動設備。您可以在 Java 環境中照原樣使用 SAX API,在 Android 上運行它不需要做任何修改。顯示了 de >FeedParserde > 接口的一個 SAX 實現。
SAX 實現
java代碼:
- public class SaxFeedParser extends BaseFeedParser {
- protected SaxFeedParser(String feedUrl){
- super(feedUrl);
- }
- public List< Message > parse() {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- try {
- SAXParser parser = factory.newSAXParser();
- RssHandler handler = new RssHandler();
- parser.parse(this.getInputStream(), handler);
- return handler.getMessages();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
如果您以前使用過 SAX,那么這對您肯定非常熟悉。與任何 SAX 實現相同,大多數細節都在 SAX 處理程序中。在分解 XML 文檔時,處理程序從 SAX 解析器接收事件。在本例中,您創建了一個新的名稱為 de >RssHandlerde > 的類,并將它注冊為解析器的處理程序,如 所示。
SAX 處理程序
- import static org.developerworks.android.BaseFeedParser.*;
- public class RssHandler extends DefaultHandler{
- private List< Message > messages;
- private Message currentMessage;
- private StringBuilder builder;
- public List< Message > getMessages(){
- return this.messages;
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- super.characters(ch, start, length);
- builder.append(ch, start, length);
- }
- @Override
- public void endElement(String uri, String localName, String name)
- throws SAXException {
- super.endElement(uri, localName, name);
- if (this.currentMessage != null){
- if (localName.equalsIgnoreCase(TITLE)){
- currentMessage.setTitle(builder.toString());
- } else if (localName.equalsIgnoreCase(LINK)){
- currentMessage.setLink(builder.toString());
- } else if (localName.equalsIgnoreCase(DESCRIPTION)){
- currentMessage.setDescription(builder.toString());
- } else if (localName.equalsIgnoreCase(PUB_DATE)){
- currentMessage.setDate(builder.toString());
- } else if (localName.equalsIgnoreCase(ITEM)){
- messages.add(currentMessage);
- }
- builder.setLength(0);
- }
- }
- @Override
- public void startDocument() throws SAXException {
- super.startDocument();
- messages = new ArrayList< Message >();
- builder = new StringBuilder();
- }
- @Override
- public void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {
- super.startElement(uri, localName, name, attributes);
- if (localName.equalsIgnoreCase(ITEM)){
- this.currentMessage = new Message();
- }
- }
- }