一、DOM 解析概述
-
在 Android 开发中可以使用 DOM 解析来读取 XML 文件,它提供了强大的 API
-
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}