当前位置:天才代写 > tutorial > 安卓教程 > android基础—->XMl数据的解析

android基础—->XMl数据的解析

2021-02-27 16:33 星期六 所属: 安卓教程 浏览:460

  在互联网上传送数据时最常见的文件格式有二种,XML和JSON,下边最先学一下怎样分析XML文件格式的数据信息。分析XML 文件格式的数据信息实际上也是有挺多种多样方法的,这节中大家学习培训较为常见的二种,Pull分析和SAX 分析。

 

文件目录导航栏

  1.  Pull分析的使用方法
  2.  Pull分析的编码
  3.  Sax分析的使用方法
  4.  Sax分析的编码
  5.  Sax与Pull的较为
  6.  友链

 

Pull分析的使用方法

 一、一般大家常见的五个事情:

  • START DOCUMENT:文本文档逐渐时,在线解析都还没载入一切数据信息
  • START_TAG:分析到标识开始
  • TEXT:分析到原素的內容
  • END_TAG:分析在标识的结尾
  • END_DOCUMENT:文本文档完毕,以后不容易再分析了

二、pull分析的流程:

  • 建立一个XMLPULL加工厂案例:

  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

  • 不特定类名得话,将应用默认设置的在线解析。若要更改类名,用setNamespaceAware()这一方式:

  factory.setNamespaceAware(true);

  • 建立一个分析的案例:

  XmlPullParser xpp = factory.newPullParser();

  • 分析键入的数据信息:

  xpp.setInput ( new FileReader (filename ) );

  • 下面就可以依据不一样的事情,做不一样的分析解决:一般用next()方式去获得下一个事情

 

Pull分析的编码

 

  • 我们在assets中建立了一个文档: linux.xml
<?xml version="1.0" encoding="utf-8"?>
<LOL>
    <person>
        <!-- 这儿是lol盖伦的注解 -->
        <name sex="man">lol盖伦</name>
        <address>德马西亚</address>
        <say>我将带领冲峰</say>
    </person>
    <person>
        <!-- 这儿是疾风剑豪的注解 -->
        <name sex="man">疾风剑豪</name>
        <address>lol祖安</address>
        <say>死亡如风,常伴吾身</say>
    </person>
    <person>
        <!-- 这儿是瑞雯的注解 -->
        <name sex="girl">瑞雯</name>
        <address>lol恕瑞玛</address>
        <say>战事与凶杀中间,潜藏着大家的心魇</say>
    </person>
</LOL>
  •  在MainActivity.xml中界定一个方式,获得linux.xml文件的內容
// 获得xml的数据信息
private String getXMLData(String fileName) {
    StringBuffer stringBuffer = new StringBuffer();
    InputStream inputStream = null;
    BufferedReader bufferedReader = null;

    try {
        inputStream = getResources().getAssets().open(fileName);
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = bufferedReader.readLine()) != null) {
            stringBuffer.append(line   "\n");
        }
        bufferedReader.close();
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    Log.i(TAG, stringBuffer.toString());
    return stringBuffer.toString();
}
  • 界定一个方式,用pull分析获得的数据信息:
// pull解析xml数据信息
public void pullParse(View view) {
    String xmlData = getXMLData(fileName);
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xmlPullParser = factory.newPullParser();
        xmlPullParser.setInput(new StringReader(xmlData));
        int eventType = xmlPullParser.getEventType();

        String name = "";
        String address = "";
        String say = "";
        String sex = "";

        while (eventType != XmlPullParser.END_DOCUMENT) {
            String nodeName = xmlPullParser.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG: {
                    if ("name".equals(nodeName)) {
                        // sex与name的部位不可以交换
              // sex = xmlPullParser.getAttributeValue(0);
                        sex = xmlPullParser.getAttributeValue(null, "sex");
                        name = xmlPullParser.nextText();
                    } else if ("address".equals(nodeName)) {
                        address = xmlPullParser.nextText();
                    } else if ("say".equals(nodeName)) {
                        say = xmlPullParser.nextText();
                    }
                    break;
                }
                // 进行分析某一节点
                case XmlPullParser.END_TAG: {
                    if ("person".equals(nodeName)) {
                        Log.d(TAG, "name: "   name);
                        Log.d(TAG, "address: "   address);
                        Log.d(TAG, "say: "   say);
                        Log.d(TAG, "sex: "   sex);
                    }
                    break;
                }
                default:
                    break;
            }
            eventType = xmlPullParser.next();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

Sax分析的使用方法

 一、 sax分析的简略:

SAX:量化策略型的XML分析方法。次序载入XML文档,不用一次所有装车全部文档。当碰到像文档开始,文本文档完毕,或是标识开始与标识完毕时,会开启一个事情,客户根据在其回调函数事情中载入解决编码来解决XML文档,合适对XML的次序浏览,且是写保护的。因为移动设备的运行内存資源比较有限,SAX的次序载入方法更合适移动应用开发。

二、 SAX分析XML流程:

  • 建立XML分析CPU。
  • 建立SAX在线解析。
  • 将XML分析CPU分派给在线解析。
  • 对文本文档开展分析,将每一个事情发给CPU。

三、SAX分析的全过程:

  • 分析逐渐以前,必须向XMLReader申请注册一个ContentHandler,也就是等同于一个事情窃听器,
  • 在ContentHandler中界定了许多方式,例如startDocument(),它订制了如在分析全过程中,碰到文本文档逐渐时应当解决的事儿。
  • 当 XMLReader读到适合的內容,便会抛出去相对的事情,并把这个事情的处理权代理商给ContentHandler,启用其相对的方式开展回应。

 

Sax分析的编码

  • 界定一个类ContentHandler,解决不一样的事情:
package com.example.linux.xmlparsetest;

import android.util.Log;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Created by Linux on 2016/3/16.
 */
public class ContentHandler extends DefaultHandler {
    private final static String TAG = "MainActivity";
    private String nodeName;
    private StringBuilder name;
    private StringBuilder address;
    private StringBuilder say;
    private StringBuilder coment;
    private StringBuilder sex;

    // 文本文档逐渐时实行
    @Override
    public void startDocument() throws SAXException {
        name = new StringBuilder();
        address = new StringBuilder();
        say = new StringBuilder();
        sex = new StringBuilder();
        coment = new StringBuilder();
    }

    // 原素逐渐时实行
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // 纪录当今节点名
        nodeName = localName;
        if (nodeName.equals("name") && attributes != null) {
            sex.append(attributes.getValue("sex"));
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // 依据当今的节点名分辨将內容加上到哪一个StringBuilder目标中
        if ("name".equals(nodeName)) {
            name.append(ch, start, length);
        } else if ("address".equals(nodeName)) {
            address.append(ch, start, length);
        } else if ("say".equals(nodeName)) {
            say.append(ch, start, length);
        }
    }

    // 原素完毕时实行
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("person".equals(localName)) {
            Log.d(TAG, "name is "   name.toString().trim());
            Log.d(TAG, "adress is "   address.toString().trim());
            Log.d(TAG, "say is "   say.toString().trim());
            Log.d(TAG, "sex is "   sex.toString().trim());
            // 最终要将StringBuilder清除掉  name.setLength(0);
            address.setLength(0);
            say.setLength(0);
            sex.setLength(0);
        }
    }

    // 文本文档完毕时
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}
  •  在MainActivity中定义方法,来开展sax分析
// sax分析数据信息
public void saxParse(View view) {
    String xmlData = getXMLData(fileName);
    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();
    }
}

 

Sax与Pull的较为

差别:

  • SAX在线解析的工作方式是全自动将事情送入申请注册的事情CPU开展解决,因而你不能操纵事情的解决积极完毕
  • PULL在线解析的工作方式为容许你的运用编程代码积极从在线解析中获得事情,正由于是积极获得事情,因而能够在考虑了必须的标准后不会再获得事情,完毕分析

 

相似度:

  Pull在线解析也出示了相近SAX的事情,逐渐文本文档START_DOCUMENT和完毕文本文档END_DOCUMENT,逐渐原素START_TAG和完毕原素END_TAG,碰到原素內容TEXT等,但必须启用next() 方式获取他们(积极获取事情)。

 

应用:

  假如在一个XML文本文档中大家只必须前边一部分数据信息,可是应用SAX方法或DOM方法会对全部文本文档开展分析,虽然XML文本文档中后边的绝大多数数据信息大家实际上都不用分析,因而那样事实上就消耗了解决資源。应用PULL方法正好。

 

友链

网站源码下载   浏览登陆密码 2c66

 

    关键字:

天才代写-代写联系方式