在Android中使用Sax解析本地XML文件

12

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

3个回答

19

要在您的应用程序中读取XML,创建一个名为“xml”(小写)的文件夹,将其放置在项目中的res文件夹内。将您的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
包 com.xml;
导入 org.xml.sax.Attributes;
导入 org.xml.sax.SAXException;
导入 org.xml.sax.helpers.DefaultHandler;
导入 android.util.Log;
导入 android.widget.Toast;
公共类 FeedHandler 扩展 DefaultHandler {
StringBuilder sb = null; String ret = ""; boolean bStore = false; int howMany = 0;
FeedHandler() { }
String getResults() { 返回 "XML解析数据。\n有 [" + howMany + "] 条状态更新\n\n" + ret; } @Override 公共无效 startDocument() throws SAXException { // 初始化“列表” }
@Override 公共无效 endDocument() throws SAXException {
}
@Override 公共无效 startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
尝试 { 如果 (localName.equals("status")) { this.sb = new StringBuilder(""); bStore = true; } 如果 (localName.equals("user")) { bStore = false; } 如果 (localName.equals("text")) { this.sb = new StringBuilder(""); Log.i("sb ", sb+"");
} 如果 (localName.equals("created_at")) { this.sb = new StringBuilder(""); } } 捕获 (Exception e) {
Log.d("startElement中的错误", e.getStackTrace().toString()); } } @Override 公共无效 endElement(String namespaceURI, String localName, String qName) throws SAXException {
如果 (bStore) { 如果 (localName.equals("created_at")) { ret += "日期:" + sb.toString() + "\n"; sb = new StringBuilder(""); 返回;
}
如果 (localName.equals("user")) { bStore = true; }
如果 (localName.equals("text")) {
ret += "帖子:" + sb.toString() + "\n\n"; sb = new StringBuilder(""); 返回;
}
} 如果 (localName.equals("status")) { howMany++; bStore = false; } } @Override 公共无效 characters(char ch[], int start, int length) {
如果 (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("运行xml文件..... ");
            // 创建工厂
            SAXParserFactory factory = SAXParserFactory.newInstance();
// 创建解析器 SAXParser parser = factory.newSAXParser();
// 创建读取器(扫描仪) XMLReader xmlreader = parser.getXMLReader();
// 实例化我们的处理程序 FeedHandler fh = new FeedHandler();
// 分配我们的处理程序 xmlreader.setContentHandler(fh);
// 执行同步解析 xmlreader.parse(is);
// 应该完成了...让我们显示结果 tvData.setText(fh.getResults());

1

示例代码

  1. 创建documentBuilderFactory

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    1. 创建DocumentBuilder

    DocumentBuilder builder = factory.newDocumentBuilder();

    1. 获取输入流 ClassLoader cls = DomReader.class.getClassLoader(); InputStream is = cls.getResourceAsStream("xml文件");
      1. 通过调用DocumentBuilder对象的parse方法解析xml文件并获取Document对象。 Document document = builder.parse(is);
      2. 使用document对象遍历dom树。 SAX: 简单的xml解析。 它逐个节点解析。 遍历是从上到下的。 低内存使用率。 无法进行后退导航。

    //实现所需的处理程序 public class SaxParse extends DefaultHandler{ } //saxParserFactory的新实例 SAXParserFactory factory = SAXParserFactory.newInstance(); //SAX PARSER的新实例 SAXParser saxparser = factory.newSAXParser(); //解析xml文档 SAXParser.parse(new File(要解析的文件), new SAXXMLParserImpl());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接