有谁能告诉我如何使用SAX解析系统中存储的本地XML文件,并提供示例代码?请同时告诉我在哪里可以找到相关信息。
要在您的应用程序中读取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
}
包 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());
示例代码
创建documentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
//实现所需的处理程序 public class SaxParse extends DefaultHandler{ } //saxParserFactory的新实例 SAXParserFactory factory = SAXParserFactory.newInstance(); //SAX PARSER的新实例 SAXParser saxparser = factory.newSAXParser(); //解析xml文档 SAXParser.parse(new File(要解析的文件), new SAXXMLParserImpl());