Анализ локального XML файла с использованием Sax в Android
Может ли кто-нибудь сказать мне, как разбирать локальный файл XML, хранящийся в системе, используя SAX, с примером кода? Пожалуйста, также скажите мне, где я могу найти информацию об этом.
Ответы
Ответ 1
Чтобы прочитать из 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
}
Ответ 2
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 display our results
tvData.setText(fh.getResults());
Ответ 3
пример кода
-
Создать documentBuilderFactory
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory. newDocumentBuilder();
- получить поток ввода
ClassLoader cls = DomReader.class.getClassLoader();
InputStream is = cls.getResourceAsStream( "xml файл" );
- проанализировать XML файл и получить объект Document, вызвав метод анализа
на объекте DocumentBuilder.
Документ document = builder.parse(is);
- Траверс dom tree с использованием объекта документа.
SAX:
Простой синтаксический анализ xml.
Он анализирует node на node
Перемещение сверху вниз
Низкое использование памяти
Назад с помощью sax невозможна.
//выполнение требуемых обработчиков Открытый класс SaxParse расширяет DefaultHandler { } // новый экземпляр saxParserFactory SAXParserFactory factory= SAXParserFactory.newInstance();
// НОВАЯ ИНСТАНЦИЯ SAX PARSER SAXParser saxparser = factory.newSAXParser(); // Анализ xml-документа
SAXParser.parse(новый файл (файл для разбора), новый SAXXMLParserImpl());