源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-11-05 09:07 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Android编程简易实现XML解析的方法详解
本文实例讲述了Android编程简易实现XML解析的方法。分享给大家供大家参考,具体如下: 首先创建在Android工程中创建一个Assets文件夹 app/src/main/assets [img]http://files.jb51.net/file_images/article/201708/201788120059484.jpg?20177812136[/img] 在这里添加一个名为 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,并重写父类的五个方法 [code]startDocument()[/code]:开始XML解析的时候调用 [code]startElement()[/code]:开始解析某个结点的时候调用 [code]characters()[/code]:获取节点中内容的时候调用 [code]endElement()[/code]:完成解析某个节点的时候调用 [code]endDocument()[/code]:完成整个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();
    }
  }

[b]方法二(直接针对InputStream解析)[/b] 获取解析工具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的解析就完成了 [img]http://files.jb51.net/file_images/article/201708/201788120142796.jpg?20177812222[/img] 除了 Pull 解析和 SAX 解析之外,还有一种 DOM 解析也非常重要。 另外还有一些XML解析工具,比如 JDOM 和 DOM4J,它们简化了解析的步骤,提高了解析的效率。 [b]PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:[/b] [b]在线XML/JSON互相转换工具: [/b][url=http://tools.jb51.net/code/xmljson]http://tools.jb51.net/code/xmljson[/url] [b]在线格式化XML/在线压缩XML: [/b][url=http://tools.jb51.net/code/xmlformat]http://tools.jb51.net/code/xmlformat[/url] [b]XML[/b][b]在线压缩/格式化工具: [/b][url=http://tools.jb51.net/code/xml_format_compress]http://tools.jb51.net/code/xml_format_compress[/url] [b]XML[/b][b]代码在线格式化美化工具: [/b][url=http://tools.jb51.net/code/xmlcodeformat]http://tools.jb51.net/code/xmlcodeformat[/url] 更多关于Android相关内容感兴趣的读者可查看本站专题:《[url=http://www.1sucai.cn/Special/837.htm]Android操作XML数据技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/367.htm]Android编程之activity操作技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/423.htm]Android资源操作技巧汇总[/url]》、《[url=http://www.1sucai.cn/Special/325.htm]Android文件操作技巧汇总[/url]》、《[url=http://www.1sucai.cn/Special/410.htm]Android开发入门与进阶教程[/url]》、《[url=http://www.1sucai.cn/Special/375.htm]Android视图View技巧总结[/url]》及《[url=http://www.1sucai.cn/Special/124.htm]Android控件用法总结[/url]》 希望本文所述对大家Android程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部