Android编程简易实现XML解析的方法详解

作者:woider 时间:2023-12-25 18:51:59 

本文实例讲述了Android编程简易实现XML解析的方法。分享给大家供大家参考,具体如下:

首先创建在Android工程中创建一个Assets文件夹 app/src/main/assets

Android编程简易实现XML解析的方法详解

在这里添加一个名为 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,并重写父类的五个方法

startDocument():开始XML解析的时候调用
startElement():开始解析某个结点的时候调用
characters():获取节点中内容的时候调用
endElement():完成解析某个节点的时候调用
endDocument():完成整个XML解析的时候调用


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的解析就完成了

Android编程简易实现XML解析的方法详解

除了 Pull 解析和 SAX 解析之外,还有一种 DOM 解析也非常重要。

另外还有一些XML解析工具,比如 JDOM 和 DOM4J,它们简化了解析的步骤,提高了解析的效率。

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson

在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat

XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress

XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

希望本文所述对大家Android程序设计有所帮助。

标签:Android,XML解析
0
投稿

猜你喜欢

  • Android移动应用开发指南之六种布局详解

    2022-09-10 06:23:44
  • java二叉查找树的实现代码

    2022-08-12 02:36:43
  • java多线程加锁以及Condition类的使用实例解析

    2023-08-07 07:25:30
  • Java构建高效结果缓存方法示例

    2021-11-12 03:52:06
  • C#中的委托使用

    2021-08-12 09:36:57
  • JAVA实现301永久重定向方法

    2023-12-18 10:59:08
  • 详解C#的排列组合

    2021-06-05 15:40:11
  • Java8 如何移除两个相同的List对象

    2023-06-07 20:57:50
  • 简单了解SpringCloud运行原理

    2023-06-09 17:07:15
  • Android入门简单实例

    2021-07-26 16:34:04
  • Android RecyclerView添加FootView和HeadView

    2022-12-11 21:17:11
  • Android仿新浪微博分页管理界面(3)

    2023-08-04 19:14:02
  • C#画笔Pen绘制光滑模式曲线的方法

    2021-11-26 05:13:33
  • Spring Boot 2结合Spring security + JWT实现微信小程序登录

    2022-07-14 08:25:54
  • Android使用gallery和imageSwitch制作可左右循环滑动的图片浏览器

    2021-08-31 22:49:45
  • C#实现观察者模式(Observer Pattern)的两种方式

    2023-06-20 21:05:18
  • C#实现DataTable转TXT、CSV文件

    2022-08-09 06:50:09
  • Android实现中轴旋转特效 Android制作别样的图片浏览器

    2023-07-03 00:37:16
  • Maven中怎么手动添加jar包到本地仓库详解(repository)

    2023-09-08 07:33:20
  • Android Application的使用全面解析

    2023-08-26 04:23:49
  • asp之家 软件编程 m.aspxhome.com