Разбор локального XML-файла с помощью Sax в Android - PullRequest
12 голосов
/ 28 апреля 2010

Может кто-нибудь сказать мне, как проанализировать локальный файл XML, хранящийся в системе, используя SAX, с примером кода? Пожалуйста, также скажите мне, где я могу найти информацию об этом.

Ответы [ 3 ]

19 голосов
/ 06 января 2011

Для чтения из 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 голосов
/ 14 марта 2011
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 голос
/ 07 ноября 2012

пример кода

  1. Создать документBuilderFactory

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ();

    1. Создать DocumentBuilder

    DocumentBuilder builder = factory. newDocumentBuilder ();

    1. получить входной поток ClassLoader cls = DomReader.class.getClassLoader (); InputStream is = cls.getResourceAsStream ("XML-файл");
      1. разобрать xml файл и получить объект Document, вызвав метод parse на объекте DocumentBuilder. Document document = builder.parse (is);
      2. Обход дерева с использованием объекта документа. SAX: Простой XML-разбор. Он анализирует узел за узлом Обход сверху вниз Низкое использование памяти Задняя навигация невозможна с sax.

    // реализация необходимых обработчиков открытый класс SaxParse extends DefaultHandler { } // новый экземпляр saxParserFactory SAXParserFactory factory = SAXParserFactory.newInstance (); // НОВАЯ ИНСТАНЦИЯ САКС ПАРСЕРА SAXParser saxparser = factory.newSAXParser (); // Разбор xml документа SAXParser.parse (новый файл (файл для анализа), новый SAXXMLParserImpl ());

...