您的位置:首页 > 移动开发 > Android开发

Android 个人学习笔记之--- DOM解析XML文件

2016-04-19 17:58 841 查看
昨天晚上发了一篇用SAX解析XML文件的博客,有兴趣的可以去看下,今天我用的DOM解析,DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低。

XML基本的节点类型

node - DOM基本的数据类型

Element - 最主要处理的对象是Element

Attr - 元素的属性

Text - 一个Element 或者Attr的实际内容

Document - 代表整个XML文档,一个Document对象通常也称为一颗DOM树

1.在src目录下新建一个Android.xml

[html] view
plain copy







<?xml version="1.0" encoding="UTF-8"?>

<persons>

<person id="23">

<name>xiaanming</name>

<age>23</age>

</person>

<person id="20">

<name>liudehua</name>

<age>28</age>

</person>

</persons>

2.新建一个Person对象来存放解析的内容

[java] view
plain copy







package com.example.dom_parser;

public class Person {

private int id;

private String name;

private int age;

public Person(){}

public Person(int id, String name, int age){

this.id = id;

this.name = name;

this.age = age;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "id = " + id + ", name = " + name + ", age = " + age;

}

}

3 新建一个DomPersonService.class,注释我写的清楚,大家自己看

[java] view
plain copy







package com.example.dom_parser;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import android.util.Log;

public class DomPersonService {

public static List<Person> readXML() throws Throwable{

//获得android.xml文件的输入流

InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("android.xml");

List<Person> persons = new ArrayList<Person>();

//实例化DocumentBuilderFactory和DocumentBuilder,并创建Document

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document document = builder.parse(is);

//返回文档的根(root)元素

Element rootElement = document.getDocumentElement();

//获取一个Note(DOM基本的数据类型)集合,这里有两个person Note

NodeList nodes = rootElement.getElementsByTagName("person");

//遍历Note集合

for(int i=0; i<nodes.getLength(); i++){

//先从第一个person元素开始解析

Element personElement = (Element) nodes.item(i);

Person person = new Person();

person.setId(Integer.valueOf(personElement.getAttribute("id")));

//获取person下面的name 和 age 的Note集合

NodeList chileNodes = personElement.getChildNodes();

for(int y=0; y<chileNodes.getLength(); y++){

Node childNode = chileNodes.item(y);

//判断子Note的类型为元素Note

if(childNode.getNodeType() == Node.ELEMENT_NODE){

Element childElement = (Element) childNode;

if("name".equals(childElement.getNodeName())){

person.setName(childElement.getFirstChild().getNodeValue());

}else if("age".equals(childElement.getNodeName())){

person.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));

}

}

}

Log.e("log", person.toString());

persons.add(person);

}

return persons;

}

}

关于DOM解析XML,我们要清楚的知道个节点之间的关系,才能更好的操作对象树,值得注意的是在建立Element时,要注意jar包的导入, 要选择org.w3c.dom.Element,而不是其他的包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: