这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
这篇文章主要介绍了 Android 编程简易实现 XML 解析的方法, 结合实例形式总结分析了 Android 操作 xml 文件的各种常见技巧与相关注意事项, 需要的朋友可以参考下
本文实例讲述了 Android 编程简易实现 XML 解析的方法。分享给大家供大家参考,具体如下:
首先创建在 Android 工程中创建一个 Assets 文件夹 app/src/main/assets
在这里添加一个名为 data.xml 的文件,然后编辑这个文件,加入如下 XML 格式内容
- <?xml version="1.0" encoding="utf-8"?>
- <apps>
- <app>
- <id>1</id>
- <name>Google Maps</name>
- <version>1.0</version>
- </app>
- <app>
- <id>2</id>
- <name>Chrome</name>
- <version>2.1</version>
- </app>
- <app>
- <id>3</id>
- <name>Google play</name>
- <version>2.3</version>
- </app>
- </apps>
============== 获取 XML 中内容 ================
- @Override protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- try {
- //获取XML文件的输入流
- InputStream fis = getResources().getAssets().open("data.xml");
- InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
- StringBuffer stringBuffer = new StringBuffer();
- int mark = -1;
- while ((mark = isr.read()) != -1) {
- stringBuffer.append((char) mark);
- }
- String data = stringBuffer.toString();
- //把整个文件内容以String方式传入
- //parseXMLWithPull(data);
- //parseXMLWithSAX(data);
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
==============Pull 解析方式 =================
获取解析工具 XmlPullParser:
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- XmlPullParser xmlPullParser = factory.newPullParser();
传入 XML 字符流:
- xmlPullParser.setInput(new StringReader(xmlData));
根据节点特征进行处理:
- switch (xmlPullParser.getEventType())
- private void parseXMLWithPull(String xmlData) {
- try {
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- XmlPullParser xmlPullParser = factory.newPullParser();
- xmlPullParser.setInput(new StringReader(xmlData));
- int eventType = xmlPullParser.getEventType();
- String id = "";
- String name = "";
- String version = "";
- while (eventType != xmlPullParser.END_DOCUMENT) {
- String nodeName = xmlPullParser.getName();
- switch (eventType) {
- //开始解析某个节点
- case XmlPullParser.START_TAG:
- {
- if ("id".equals(nodeName)) {
- id = xmlPullParser.nextText();
- } else if ("name".equals(nodeName)) {
- name = xmlPullParser.nextText();
- } else if ("version".equals(nodeName)) {
- version = xmlPullParser.nextText();
- }
- }
- break;
- //完成解析某个节点
- case XmlPullParser.END_TAG:
- {
- if ("app".equals(nodeName)) {
- Log.d("woider", "id is " + id);
- Log.d("woider", "name is " + name);
- Log.d("woider", "version is " + version);
- }
- }
- break;
- }
- eventType = xmlPullParser.next();
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
==============SAX 解析方式 =================
使用 SAX 解析通常需要创建一个类继承 DefaultHandler,并重写父类的五个方法
:开始 XML 解析的时候调用
- startDocument()
:开始解析某个结点的时候调用
- startElement()
:获取节点中内容的时候调用
- characters()
:完成解析某个节点的时候调用
- endElement()
:完成整个 XML 解析的时候调用
- endDocument()
- public class ContentHandler extends DefaultHandler {
- private String nodeName;
- private StringBuilder id;
- private StringBuilder name;
- private StringBuilder version;
- @Override
- public void startDocument() throws SAXException {
- id = new StringBuilder();
- name = new StringBuilder();
- version = new StringBuilder();
- }
- @Override
- public void startElement(String uri, String localName, String qName, Attributes attributes)
- throws SAXException {
- //记住当前结点名
- nodeName = localName;
- }
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- //进行格式规范化
- String str = new String(ch, start, length).trim();
- //根据当前节点名添加内容
- if ("id".equals(nodeName)) {
- id.append(str);
- } else if ("name".equals(nodeName)) {
- name.append(str);
- } else if ("version".equals(nodeName)) {
- version.append(str);
- }
- }
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- if ("app".equals(localName)) {
- Log.d("woider", "id is " + id);
- Log.d("woider", "name is " + name);
- Log.d("woider", "version is " + version);
- //清空StringBuilder
- id.setLength(0);
- name.setLength(0);
- version.setLength(0);
- }
- }
- @Override
- public void endDocument() throws SAXException {
- }
- }
获取解析工具 XMLReader:
- SAXParserFactory factory = SAXParserFactory.newInstance();
- XMLReader xmlReader = factory.newSAXParser().getXMLReader();
传入规则到解析工具:
- ContentHandler handler = new ContentHandler();
- xmlReader.setContentHandler(handler);
开始执行解析:
- xmlReader.parse(new InputSource(new StringReader(xmlData)));
- private void parseXMLWithSAX(String xmlData) {
- try {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- XMLReader xmlReader = factory.newSAXParser().getXMLReader();
- ContentHandler handler = new ContentHandler();
- //将ContentHandler的实例设置到XMLReader中
- xmlReader.setContentHandler(handler);
- //开始执行解析
- xmlReader.parse(new InputSource(new StringReader(xmlData)));
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
方法二(直接针对 InputStream 解析)
获取解析工具 SAXParser:
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
获取规则和输入流:
- handler = new ParserHandler();
- InputStream inputStream = getResources().getAssets().open("data.xml");
同时传入开始解析:
- parser.parse(inputStream, handler);
最后打印 LogCat 中的日志,data.xml 的解析就完成了
除了 Pull 解析和 SAX 解析之外,还有一种 DOM 解析也非常重要。
另外还有一些 XML 解析工具,比如 JDOM 和 DOM4J,它们简化了解析的步骤,提高了解析的效率。
希望本文所述对大家 Android 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0826/344176.html