android解析XML

本文介绍了XML在Android中的应用,重点讲解了PULL解析器的工作原理和使用方法,通过实例展示了如何解析XML文件,提取数据并存储到列表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML是一种常用的数据存储方式,在Android平台内部很多地方都使用了XML存储,轻量级的SharedPreferences 类的存储就使用了XML文件。

XML解析主要有三种方式,SAX DOM, 和Android自带的PULL解析器解析XML文件。

常规在PC使用DOM相对轻松,对一些性能敏感的数据库或手机主要采用SAX方式,SAX读取是单向的,优点是不占用空间,属性解析方便,但对于嵌套多个分支来说不是很方便,而DOM方式会把整个XML文件加载到内存中去,优点是可以任意读取节点,但是消耗内存

PULL常用于移动设备,节省内存。

PULL解析原理:

PULL解析器与SAX解析器相似,它提供了类似的事件,如:开始元素和结束元素事件,使用parse.next()可以进入下一个,元素并触发响应的事件,事件将作为数值代码发送,因此可以使用一个switch对感兴趣的事件进行处理,当元素开始解析时,调用parser.nextText ()方法可以获取下一个Text类型元素的值。

实例如下:

1:创建一个XML文件如下,该文件存放于 (res/ raw/person.xml):

<condingke>
    <person  personid= "1">
        <name></name>
        <age>22</age>
        <sex></sex>
        <tel>18829290900</tel>
    </person>
    <person  personid= "2">
        <name></name>
        <age>18</age>
        <sex></sex>
        <tel>18829296666</tel>
    </person>
</condingke>

2:创建一个类,包含上面xml中的属性生成toString方法即可

主程序:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    // 使用PULL解析XML文件
    public void pullparse_Click (View view){
         ArrayList<Person> list =Parser();
        for (int i = 0 ;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
    private ArrayList<Person> Parser() {
        Person p = null;
        ArrayList<Person> list = new ArrayList<>();// 创建PULL解析器
        XmlPullParser pullParser = Xml.newPullParser();
        //获取xml资源
        InputStream in =getResources().openRawResource(R.raw.person);
        try {
          // 设置要解析的流
            pullParser.setInput(in, "UTF-8");
          // 获取当前的事件类型
            int  eventType=pullParser.getEventType();
            // 根据事件类型来解析
            while (eventType!=XmlPullParser.END_DOCUMENT){
              switch (eventType){
                  //读到开始标记
                  case XmlPullParser.START_TAG :
                      // 获取标记名
                    String tag= pullParser.getName();
                      if ("person".equals(tag)){
                          p = new Person();
                          // getAttributeValue返回值类型为String虚需强制类型转换
                          p.personid =Integer.parseInt(pullParser.getAttributeValue(null,"personid"));
                      } else if ("name".equals(tag)){
                          p.name=pullParser.nextText();
                      }else if ("age".equals(tag)){
                          p.age= Integer.parseInt(pullParser.nextText());
                      }else if ("sex".equals(tag)){
                          p.sex=pullParser.nextText();
                      }else if ("tel".equals(tag)){
                          p.tel=pullParser.nextText();
                      }
                  break;
                  //每次读完一个标签判断然后将其存储起来
                  case XmlPullParser.END_TAG:
                      if ("person".equals(pullParser.getName())){
                          list.add(p); //添加到list中保存
                      }
                      break;
              }
                //获取下一事件类型(循环读取)
                eventType=pullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    return list;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值