欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-05 23:21:46
本文实例讲述了android编程简易实现xml解析的方法。分享给大家供大家参考,具体如下: 首先创建在android工程中创建一个assets文件夹 app/src/ma...

本文实例讲述了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互相转换工具:

在线格式化xml/在线压缩xml

xml在线压缩/格式化工具:

xml代码在线格式化美化工具:

更多关于android相关内容感兴趣的读者可查看本站专题:《android操作xml数据技巧总结》、《android编程之activity操作技巧总结》、《android资源操作技巧汇总》、《android文件操作技巧汇总》、《android开发入门与进阶教程》、《android视图view技巧总结》及《android控件用法总结

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