使用Sax解析本地XML文件

问题描述:

谁能告诉我如何使用SAX解析存储在系统中的本地XML文件,并附上示例代码?请同时告诉我在哪里可以找到有关这方面的信息。使用Sax解析本地XML文件

要从您的应用程序中读取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 
    } 

 
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. 创建文档创建工厂

    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());