欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Android 读取 XML 文件之 DOM 解析编码模板

Android 读取 XML 文件之 DOM 解析编码模板

2024/10/24 3:26:27 来源:https://blog.csdn.net/weixin_52173250/article/details/141742299  浏览:    关键词: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;}@Overridepublic 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}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com