Android中的DOM解析方式
1、DOM解析简介
DOM解析会将XML文件的内容,以对象树的形式存放在内存中。DOM解析采用了对象树这种形式存储,使它易于遍历,方便的知道上下层节点的情况,这是DOM解析与SAX解析最大的不同之处。SAX解析只能够知道自己节点的情况,无法得知其它节点的信息。2、DOM解析常用方法
(1)Document.getDocumentElement():返回文档的根元素(2)Node.getPreviousSibling()、Node.getNextSibling():返回上一个或者下一个同胞元素
(3)Node.getFirstChild()、Node.getLastChild():返回给定节点的第一个子节点或者最后一个节点
(4)Node.getAttribute(attrName):获取指定属性的对象
3、DOM解析思路
(1)不用说,第一步还是创建一个存储XML文件读取信息的实体对象(2)创建一个DocumentBuilderFactory对象,根据它得到DocumentBuilder对象
(3)DocumentBuilder实例调用parse方法,传递的参数是读取的文件流对象
(4)根据节点名称、属性值等信息遍历XML文件,存储起来
4、举例说明
4.1 新建实体:
public class Person { private Integer id; private String name; private Short age; public Person(){} public Person(Integer id, String name, Short age) { this.id = id; this.name = name; this.age = age; } // 省略setter()和getter()方法 }
4.2 解析类:
public static List<Person> getPersons(InputStream inStream) throws Exception{ List<Person> persons = new ArrayList<Person>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inStream); Element root = document.getDocumentElement(); NodeList personNodes = root.getElementsByTagName("person"); for(int i=0; i < personNodes.getLength() ; i++){ Element personElement = (Element)personNodes.item(i); int id = new Integer(personElement.getAttribute("id")); Person person = new Person(); person.setId(id); NodeList childNodes = personElement.getChildNodes(); for(int y=0; y < childNodes.getLength() ; y++){ if(childNodes.item(y).getNodeType()==Node.ELEMENT_NODE){ if("name".equals(childNodes.item(y).getNodeName())){ String name = childNodes.item(y).getFirstChild().getNodeValue(); person.setName(name); }else if("age".equals(childNodes.item(y).getNodeName())){ String age = childNodes.item(y).getFirstChild().getNodeValue(); person.setAge(new Short(age)); } } } persons.add(person); } inStream.close(); return persons; }
5、对比SAX解析
(1)SAX的事件驱动是回调相应的方法,需要提供回调的方法。(2)DOM解析中是一种树形的结构,节点与节点之间都有这等级关系,我们简单的给出一个图示如下:
我们对比看看的xml文件的内容与解析出来的树形结构图:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。