誰能告訴我如何使用SAX解析存儲在系統中的本地XML文件,並附上示例代碼?請同時告訴我在哪裏可以找到有關這方面的信息。使用Sax解析本地XML文件
11
A
回答
19
要從您的應用程序中讀取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
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();
- 創建的DocumentBuilder
的DocumentBuilder建設者=工廠。 newDocumentBuilder();
- 得到輸入流 類加載器CLS = DomReader.class.getClassLoader(); InputStream is = cls.getResourceAsStream(「xml file」);
- 解析xml文件並通過調用DocumentBuilder對象上的解析方法 來獲取Document對象。 Document document = builder.parse(is);
- 使用文檔對象遍歷dom樹。 SAX: 簡單的xml解析。 它逐節點解析 遍歷從上到下 低內存使用率 使用sax不能返回導航。
//執行所需的處理程序 公共類SaxParse延伸的SAXParserFactory的 的SAXParserFactory工廠= SAXParserFactory.newInstance()的DefaultHandler { } //新的實例; // SAX PARSER的新實例 SAXParser saxparser = factory.newSAXParser(); //解析xml文檔 SAXParser.parse(新的文件(要解析的文件),新的SAXXMLParserImpl());
相關問題
- 1. 使用Sax解析大型XML文件
- 2. 解析XML使用SAX
- 3. 使用android sax解析器解析XML
- 4. 使用sax解析器解析XML
- 5. 使用SAX解析器解析java中的XML文件
- 6. 使用SAX解析器解析UTF-8 XML文件的問題
- 7. 使用SAX解析器,如何解析java中的xml文件
- 8. SAX,XML文件解析錯誤
- 9. Java SAX:動態解析XML文件
- 10. XML解析與SAX
- 11. 使用SAX解析器解析具有多個XML標記的XML文件
- 12. 用SAX解析遞歸XML
- 13. 用SAX解析器解析XML
- 14. 使用SAX解析常用XML元素
- 15. 如何使用SAX XML解析器解析XML
- 16. 使用Java讀取XML - SAX解析器
- 17. 在Android上使用Sax解析Xml
- 18. 使用sax解析xml響應
- 19. XML解析使用SAX黑莓
- 20. 使用SAX XML解析中的問題
- 21. 使用SAX解析XML字符串
- 22. 使用SAX解析器分割XML
- 23. 使用XPath/DOM/SAX解析XML
- 24. 在android中使用SAX的XML解析
- 25. 使用SAX的XML解析器java Swing
- 26. 如何增加使用SAX解析XML文件的entityExpansionLimit
- 27. 如何使用Perl的XML :: SAX解析文件?
- 28. 如何使用SAX解析大型XML文件?
- 29. 嘗試使用Java SAX解析excel xml文件時出錯
- 30. XML的文件使用SAX解析器拉鍊