一、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;
}
@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}