【Android基础】XML数据解析

一、Xml格式数据简单理解

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="1">
        <name>zhangshan</name>
        <age>20</age>
    </person>
    <person id="2">
        <name>lisi</name>
        <age>25</age>
    </person>
    <person id="3">
        <name>wangwu</name>
        <age>30</age>
    </person>
</persons>
<!--开始元素(标签)persons-->
    <!--开始元素(标签) 属性名称=“属性的值”-->
        <!--开始元素(标签) 元素内容 结束元素(标签)-->
        <!--开始元素(标签) 元素内容 结束元素(标签)-->
    <!--结束元素(标签)-->
    ......
<!--结束元素(标签)-->

二、Pull解析

1、使用步骤

1)创建解析器工厂对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2)从工厂中获取解析器对象
XmlPullParser parser = factory.newPullParser();
3)设置解析器输入流
parser.setInput(inputStream,"UTF-8");
4)获得事件的类型
int eventType = parser.getEventType();
  • START_DOCUMENT
    开始读文档时触发,在这里完成一些初始化操作
  • START_TAG
    开始标签(元素)
    通过XmlPullParser的getName()方法获取标签名进行比较。
//获取属性的值
parser.getAttributeValue(String namespace,String name)

//获取元素内容
parser.nextText()
  • END_TAG
    结束标签(元素)
  • XmlPullParser.next()
    到下一个标签(元素)
5)解析并显示

2、案例

res/raw下自定义一个persons.xml文件

<?xml version="1.0" encoding="utf-8"?>
<persons>
    <person id="1">
        <name>zhangshan</name>
        <age>20</age>
    </person>
    <person id="2">
        <name>lisi</name>
        <age>25</age>
    </person>
    <person id="3">
        <name>wangwu</name>
        <age>30</age>
    </person>
</persons>

定义一个Person类

public class Person {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

解析并显示

public class MainActivity extends AppCompatActivity {
    private Button pull;
    private Button sax;
    private TextView data;
    private InputStream is;

    private ArrayList<Person> personList = new ArrayList<>();
    private StringBuffer sb = new StringBuffer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pull = findViewById(R.id.pull);
        sax = findViewById(R.id.sax);
        data = findViewById(R.id.data);

        is = getResources().openRawResource(R.raw.persons);

        //pull解析
        pull.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                personList = xmlByPull(is);
                for(int i = 0; i < personList.size(); i++){
                    String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName() + " , age = " + personList.get(i).getAge() + ".\n";
                    sb.append(message);
                }
                data.setText("Xml数据:\n" + sb.toString());
            }
        });

        //sax解析
        sax.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }

    ArrayList<Person> xmlByPull(InputStream inputStream){
        ArrayList<Person> arrayList = null;
        Person person = null;
        try {
            //创建解析器工厂对象
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            //从工厂中获取解析器对象
            XmlPullParser parser = factory.newPullParser();
            //设置解析器输入流
            parser.setInput(inputStream,"UTF-8");
            //获得事件的类型
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String name = parser.getName();
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        arrayList = new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        if ("person".equals(name)) {
                            person = new Person();
                            //该节点有id属性,则获取id属性
                            int id = Integer.parseInt(parser.getAttributeValue(null, "id"));
                            person.setId(id);
                        }

                        if (person != null) {
                            if ("name".equals(name)) {
                                person.setName(parser.nextText());
                            }
                            if ("age".equals(name)) {
                                person.setAge(new Integer(parser.nextText()));
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("person".equals(name)) {
                            arrayList.add(person);
                            person = null;
                        }
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return arrayList;
    }
}

三、SAX解析

1、使用步骤

1)创建一个类集成DefaultHandler,重写其方法
public class SaxHandler extends DefaultHandler {

    // 文档开始时,调用此方法。在这里完成一些初始化操作
    @Override
    public void startDocument() throws SAXException {
    }

    // 标签开始时,调用此方法
    // uri:命名空间
    // localName:不带命名空间前缀的标签名
    // qName:带命名空间前缀的标签名
    // attributes:属性
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    }

    // 读到内容时,调用此方法
    // ch:元素内容
    // start:起始位置
    // length:内容长度
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
    }

    // 标签结束时,调用此方法
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
    }

    // 文档结束时,调用此方法
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}
2)得到SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
3)创建SAX解析器
SAXParser saxParser = factory.newSAXParser();
4)创建自己的XML解析处理器
SaxHandler saxHandler = new SaxHandler();
5)将解析处理器分配给解析器
saxParser.parse(inputStream, saxHandler);
6)得到数据

2、案例

自定义解析处理器

public class SaxHandler extends DefaultHandler {
    private ArrayList<Person> personList = null;
    private Person person = null;
    private String tagName = null;

    public ArrayList<Person> getPersons() {
        return personList;
    }

    // 文档开始时,调用此方法。在这里完成一些初始化操作
    @Override
    public void startDocument() throws SAXException {
        personList = new ArrayList<>();
    }

    // 标签开始时,调用此方法
    // uri:命名空间
    // localName:不带命名空间前缀的标签名
    // qName:带命名空间前缀的标签名
    // attributes:属性
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("person".equals(localName)) {
            person = new Person();
            person.setId(Integer.parseInt(attributes.getValue("id")));
        }
        tagName = localName;
    }

    // 读到内容时,调用此方法
    // ch:元素内容
    // start:起始位置
    // length:内容长度
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (tagName != null) {
            String data = new String(ch, start, length);
            if ("name".equals(tagName)) {
                person.setName(data);
            }
            if ("age".equals(tagName)) {
                person.setAge(Integer.parseInt(data));
            }
        }
    }

    // 标签结束时,调用此方法
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("person".equals(localName)) {
            personList.add(person);
            person = null;
        }
        tagName = null;
    }

    // 文档结束时,调用此方法
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}
public class MainActivity extends AppCompatActivity {
    private Button pull;
    private Button sax;
    private TextView data;
    private InputStream is;

    private ArrayList<Person> personList = new ArrayList<>();
    private StringBuffer sb = new StringBuffer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pull = findViewById(R.id.pull);
        sax = findViewById(R.id.sax);
        data = findViewById(R.id.data);

        is = getResources().openRawResource(R.raw.persons);

        //sax解析
        sax.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                personList = xmlBySAX(is);
                for(int i = 0; i < personList.size(); i++){
                    String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName() + " , age = " + personList.get(i).getAge() + ".\n";
                    sb.append(message);
                }
                data.setText("Xml数据:\n" + sb.toString());
            }
        });
    }

    ArrayList<Person> xmlBySAX(InputStream inputStream) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            SaxHandler saxHandler = new SaxHandler();
            saxParser.parse(inputStream, saxHandler);
            return saxHandler.getPersons();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值