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稍微了解下就可以了。