Android应用中使用DOM方式解析XML格式数据的基本方法
DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低。
XML基本的节点类型
node-DOM基本的数据类型
Element-最主要处理的对象是Element
Attr-元素的属性
Text-一个Element或者Attr的实际内容
Document-代表整个XML文档,一个Document对象通常也称为一颗DOM树
1.在src目录下新建一个android.xml
<?xmlversion="1.0"encoding="UTF-8"?> <persons> <personid="23"> <name>xiaanming</name> <age>23</age> </person> <personid="20"> <name>liudehua</name> <age>28</age> </person> </persons>
2.新建一个Person对象来存放解析的内容
packagecom.example.dom_parser; publicclassPerson{ privateintid; privateStringname; privateintage; publicPerson(){} publicPerson(intid,Stringname,intage){ this.id=id; this.name=name; this.age=age; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } @Override publicStringtoString(){ return"id="+id+",name="+name+",age="+age; } }
3新建一个DomPersonService.class,注释我写的清楚,大家自己看
packagecom.example.dom_parser; importjava.io.InputStream; importjava.util.ArrayList; importjava.util.List; importjavax.xml.parsers.DocumentBuilder; importjavax.xml.parsers.DocumentBuilderFactory; importorg.w3c.dom.Document; importorg.w3c.dom.Element; importorg.w3c.dom.Node; importorg.w3c.dom.NodeList; importandroid.util.Log; publicclassDomPersonService{ publicstaticList<Person>readXML()throwsThrowable{ //获得android.xml文件的输入流 InputStreamis=MainActivity.class.getClassLoader().getResourceAsStream("android.xml"); List<Person>persons=newArrayList<Person>(); //实例化DocumentBuilderFactory和DocumentBuilder,并创建Document DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=factory.newDocumentBuilder(); Documentdocument=builder.parse(is); //返回文档的根(root)元素 ElementrootElement=document.getDocumentElement(); //获取一个Note(DOM基本的数据类型)集合,这里有两个personNote NodeListnodes=rootElement.getElementsByTagName("person"); //遍历Note集合 for(inti=0;i<nodes.getLength();i++){ //先从第一个person元素开始解析 ElementpersonElement=(Element)nodes.item(i); Personperson=newPerson(); person.setId(Integer.valueOf(personElement.getAttribute("id"))); //获取person下面的name和age的Note集合 NodeListchileNodes=personElement.getChildNodes(); for(inty=0;y<chileNodes.getLength();y++){ NodechildNode=chileNodes.item(y); //判断子Note的类型为元素Note if(childNode.getNodeType()==Node.ELEMENT_NODE){ ElementchildElement=(Element)childNode; if("name".equals(childElement.getNodeName())){ person.setName(childElement.getFirstChild().getNodeValue()); }elseif("age".equals(childElement.getNodeName())){ person.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue())); } } } Log.e("log",person.toString()); persons.add(person); } returnpersons; } }
关于DOM解析XML,我们要清楚的知道个节点之间的关系,才能更好的操作对象树,值得注意的是在建立Element时,要注意jar包的导入,要选择org.w3c.dom.Element,而不是其他的包。
PS:DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。
这里列出几个dom中经常用到的方法:
Node接口的常用方法
一个节点可以调用
shortgetNodeType()
方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:
Node.ELEMENT_NODE
节点可以调用
NodeList getChildNodes()
返回一个由当前节点的所有子节点组成的NodeList对象。节点调用
Node getFirstChild()
返回当前节点的第一个子节点。节点调用
Node getLastChild()
返回当前节点的最后一个子节点。节点可以调用
NodeList getTextContent()
返回当前节点及所有子孙节点中的文本内容。
还有其他的很多很多方法,我们可以通过api来详细了解。因为这里主要是为了学习android,所以关于dom稍微了解下就可以了。