Может ли кто-нибудь сказать мне, как разбирать локальный файл XML, хранящийся в системе, используя SAX, с примером кода? Пожалуйста, также скажите мне, где я могу найти информацию об этом.
Анализ локального XML файла с использованием Sax в Android
Ответ 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
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());