1-3.Android 读取 XML 文件之 DOM 解析编码模板

一、DOM 解析概述

  1. 在 Android 开发中可以使用 DOM 解析来读取 XML 文件,它提供了强大的 API

  2. DOM 解析对于小型到中等规模的 XML 文件比较是首选


二、DOM 解析基本使用

1、XML
  • user.xml,准备好 XML 文件,该文件放置在 res/raw 目录下,这样,在 Activity 中可通过 getResources().openRawResource() 获取到该目录下的资源
<users>
    <user>
        <name>jack</name>
        <age>21</age>
    </user>
    <user>
        <name>tom</name>
        <age>22</age>
    </user>
</users>
2、Test Code
(1)解析 XML 文件
InputStream inputStream = getResources().openRawResource(R.raw.users);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputStream);
(2)获取节点
  • 获取到的节点分为元素节点和文本节点,我们只关注元素节点即可
// 获取根节点,即 users 节点
Element rootElement = document.getDocumentElement();

// 获取根节点下的所有子节点,即 user 节点(元素节点)和文本节点
NodeList childNodes = rootElement.getChildNodes();

Log.i(TAG, "------------------------------ 子节点个数:" + childNodes.getLength());

for (int i = 0; i < childNodes.getLength(); i++) {
    Node userNode = childNodes.item(i);
    if (userNode.getNodeType() == Node.ELEMENT_NODE) {
        Log.i(TAG, "-------------------- 元素节点:" + userNode.getNodeName());
    } else if (userNode.getNodeType() == Node.TEXT_NODE) {
        Log.i(TAG, "-------------------- 文本节点:" + userNode.getNodeName());
    }
}
  • 输出结果
I/GetXmlActivity: ------------------------------ 子节点个数:5
I/GetXmlActivity: -------------------- 文本节点:#text
I/GetXmlActivity: -------------------- 元素节点:user
I/GetXmlActivity: -------------------- 文本节点:#text
I/GetXmlActivity: -------------------- 元素节点:user
I/GetXmlActivity: -------------------- 文本节点:#text
(3)获取元素节点内容
for (int i = 0; i < childNodes.getLength(); i++) {
    Node userNode = childNodes.item(i);
    if (userNode.getNodeType() != Node.ELEMENT_NODE) continue;

    NodeList userNodeChildNodes = userNode.getChildNodes();
    for (int j = 0; j < userNodeChildNodes.getLength(); j++) {
        Node userNodeChildNode = userNodeChildNodes.item(j);
        if (userNodeChildNode.getNodeType() != Node.ELEMENT_NODE) continue;

        String name = userNodeChildNode.getNodeName();
        String text = userNodeChildNode.getTextContent();
        Log.i(TAG, "-------------------- " + name + ": " + text);
    }
}
  • 输出结果
I/GetXmlActivity: -------------------- name: jack
I/GetXmlActivity: -------------------- age: 21
I/GetXmlActivity: -------------------- name: tom
I/GetXmlActivity: -------------------- age: 22

三、DOM 解析实例实操

1、案例引入
  • 将如下的 XML 文件,希望将它解析成 2 个 User 对象,并放入 List<User> users 集合中
<users>
    <user>
        <name>jack</name>
        <age>21</age>
    </user>
    <user>
        <name>tom</name>
        <age>22</age>
    </user>
</users>
3、具体实现
(1)Entity
public class User {
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
(2)Test Code
List<User> users = new ArrayList<>();

try {
    InputStream inputStream = getResources().openRawResource(R.raw.users);
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(inputStream);

    Element rootElement = document.getDocumentElement();
    NodeList childNodes = rootElement.getChildNodes();

    for (int i = 0; i < childNodes.getLength(); i++) {
        Node userNode = childNodes.item(i);
        if (userNode.getNodeType() != Node.ELEMENT_NODE) continue;

        User user = new User();

        NodeList userNodeChildNodes = userNode.getChildNodes();
        for (int j = 0; j < userNodeChildNodes.getLength(); j++) {
            Node userNodeChildNode = userNodeChildNodes.item(j);
            if (userNodeChildNode.getNodeType() != Node.ELEMENT_NODE) continue;

            String name = userNodeChildNode.getNodeName();
            String text = userNodeChildNode.getTextContent();

            if (name.equals("name")) {
                user.setName(text);
            } else if (name.equals("age")) {
                try {
                    user.setAge(Integer.parseInt(text));
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
            }
        }

        users.add(user);
    }
} catch (ParserConfigurationException | IOException | SAXException e) {
    e.printStackTrace();
}

for (User u : users) {
    Log.i(TAG, "---------- " + u);
}
  • 输出结果
I/GetXmlActivity: ---------- User{name='jack', age=21}
I/GetXmlActivity: ---------- User{name='tom', age=22}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值