2010-04-28 113 views
11

誰能告訴我如何使用SAX解析存儲在系統中的本地XML文件,並附上示例代碼?請同時告訴我在哪裏可以找到有關這方面的信息。使用Sax解析本地XML文件

回答

19

要從您的應用程序中讀取XML,請在您的項目內的res文件夾中創建一個名爲「xml」(小寫)的文件夾。將您的xml存儲在這個新創建的文件夾中。若要從資源加載XML,

XmlResourceParser myxml = mContext.getResources().getXml(R.xml.MyXml);//MyXml.xml is name of our xml in newly created xml folder, mContext is the current context 
// Alternatively use: XmlResourceParser myxml = getContext().getResources().getXml(R.xml.MyXml); 

myxml.next();//Get next parse event 
int eventType = myxml.getEventType(); //Get current xml event i.e., START_DOCUMENT etc. 

然後就可以開始處理節點,屬性等,並通過套管事件類型,處理一次呼叫myxml.next(內包含的文本),以獲得下一個事件,即,

String NodeValue; 
    while (eventType != XmlPullParser.END_DOCUMENT) //Keep going until end of xml document 
    { 
     if(eventType == XmlPullParser.START_DOCUMENT) 
     {  
      //Start of XML, can check this with myxml.getName() in Log, see if your xml has read successfully 
     }  
     else if(eventType == XmlPullParser.START_TAG) 
     {  
      NodeValue = myxml.getName();//Start of a Node 
      if (NodeValue.equalsIgnoreCase("FirstNodeNameType")) 
      { 
        // use myxml.getAttributeValue(x); where x is the number 
        // of the attribute whose data you want to use for this node 

      } 

      if (NodeValue.equalsIgnoreCase("SecondNodeNameType")) 
      { 
        // use myxml.getAttributeValue(x); where x is the number 
        // of the attribute whose data you want to use for this node 

      } 
      //etc for each node name 
     } 
     else if(eventType == XmlPullParser.END_TAG) 
     {  
      //End of document 
     }  
     else if(eventType == XmlPullParser.TEXT) 
     {  
      //Any XML text 
     } 

     eventType = myxml.next(); //Get next event from xml parser 
    } 
6
 
package com.xml; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
import android.util.Log; 
import android.widget.Toast; 

public class FeedHandler extends DefaultHandler { 

    StringBuilder sb = null; 
    String ret = ""; 
    boolean bStore = false; 
    int howMany = 0; 

    FeedHandler() { } 

    String getResults() 
    { 
     return "XML parsed data.\nThere are [" + howMany + "] status updates\n\n" + ret; 
    } 
    @Override 
    public void startDocument() throws SAXException 
    { 
     // initialize "list" 
    } 

    @Override 
    public void endDocument() throws SAXException 
    { 

    } 

    @Override 
    public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 

     try { 
      if (localName.equals("status")) 
      { 
       this.sb = new StringBuilder(""); 
       bStore = true; 
      } 
      if (localName.equals("user")) 
      { 
       bStore = false; 
      } 
      if (localName.equals("text")) 
      { 
       this.sb = new StringBuilder(""); 
       Log.i("sb ", sb+""); 

      } 
      if (localName.equals("created_at")) 
      { 
       this.sb = new StringBuilder(""); 
      } 
     } catch (Exception e) 
     { 

      Log.d("error in startElement", e.getStackTrace().toString()); 
     } 
    } 
    @Override 

    public void endElement(String namespaceURI, String localName, String qName) throws SAXException 
    { 

     if (bStore) 
     { 
      if (localName.equals("created_at")) 
      { 
       ret += "Date: " + sb.toString() + "\n"; 
       sb = new StringBuilder(""); 
       return; 

      } 

      if (localName.equals("user")) 
      { 
       bStore = true; 
      } 

      if (localName.equals("text")) 
      { 

       ret += "Post: " + sb.toString() + "\n\n"; 
       sb = new StringBuilder(""); 
       return; 

      } 


     } 
     if (localName.equals("status")) 
     { 
      howMany++; 
      bStore = false; 
     } 
    } 
    @Override 

    public void characters(char ch[], int start, int length) 
    { 

     if (bStore) 
     { 
//   System.out.println("start " +start+"length "+length); 
      String theString = new String(ch, start, length); 

      this.sb.append(theString+"start "+start+" length "+length); 
     } 
    } 

} 
 
InputSource is = new InputSource(getResources().openRawResource(R.raw.my)); 
       System.out.println("running xml file..... "); 
      // create the factory 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 

      // create a parser 
      SAXParser parser = factory.newSAXParser(); 

      // create the reader (scanner) 
      XMLReader xmlreader = parser.getXMLReader(); 

      // instantiate our handler 
      FeedHandler fh = new FeedHandler(); 

      // assign our handler 
      xmlreader.setContentHandler(fh); 

      // perform the synchronous parse 
      xmlreader.parse(is); 

      // should be done... let's display our results 
      tvData.setText(fh.getResults());
1

示例代碼

  1. 創建文檔創建工廠

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    1. 創建的DocumentBuilder

    的DocumentBuilder建設者=工廠。 newDocumentBuilder();

    1. 得到輸入流 類加載器CLS = DomReader.class.getClassLoader(); InputStream is = cls.getResourceAsStream(「xml file」);
      1. 解析xml文件並通過調用DocumentBuilder對象上的解析方法 來獲取Document對象。 Document document = builder.parse(is);
      2. 使用文檔對象遍歷dom樹。 SAX: 簡單的xml解析。 它逐節點解析 遍歷從上到下 低內存使用率 使用sax不能返回導航。

    //執行所需的處理程序 公共類SaxParse延伸的SAXParserFactory的 的SAXParserFactory工廠= SAXParserFactory.newInstance()的DefaultHandler { } //新的實例; // SAX PARSER的新實例 SAXParser saxparser = factory.newSAXParser(); //解析xml文檔 SAXParser.parse(新的文件(要解析的文件),新的SAXXMLParserImpl());