Android中对xml文件解析的3种方式总结
前言
xml是数据传输的一种格式,Android中的布局文件、设置文件等都采用它来表示。Android中对xml文件的解析也有多种方式,下面介绍常用的3种方式:Dom、SAX和dom4j。下面话不多说了,来一起看看详细的介绍吧。
先看一个简单的xml文件:
<书出版社="骏马"> <书名>如何成功书名> <作者>uniapp作者> <售价>666售价> 书> <书> <书名>如何成功1书名> <作者>uniapp作者> <售价>1991售价> 书> 书架>
1、Dom解析方式
Dom解析通过Document类将整个xml文件一次读入内存,然后通过操作Document实例的属性实现对xml文件中元素的增删改查,具体代码如下:
2SAX解析
SAX对xml文件采用边读边解析的方式,就像我们用眼睛读文章一样,一行一行的进行。相比Dom方式产生的瞬时内存峰值,SAX对内存的消耗比较平稳。它通过解析类提供对外接口,具体实现:
publicclassSaxDemo{
@Test
publicvoidmain()throwsParserConfigurationException,SAXException,IOException{
//工厂类实例
SAXParserFactoryfac=SAXParserFactory.newInstance();
//创建解析器
SAXParserparser=fac.newSAXParser();
//解析文档
XMLReaderreader=parser.getXMLReader();
reader.setContentHandler(newMyDefultHandle());
reader.parse("./app/src/main/java/test/DTD.xml");
}
}
classMyDefultHandleextendsDefaultHandler{
@Override
publicvoidstartDocument()throwsSAXException{
super.startDocument();
System.out.println("文档开始");
}
@Override
publicvoidendDocument()throwsSAXException{
super.endDocument();
System.out.println("文档结束");
}
privatebooleanisPrice=false;
@Override
publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{
super.startElement(uri,localName,qName,attributes);
System.out.println("元素开始:"+qName);
}
@Override
publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{
super.endElement(uri,localName,qName);
if("售价".equals(qName)){
isPrice=false;
}
System.out.println("元素结束:"+qName);
}
@Override
publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
super.characters(ch,start,length);
if(isPrice){
System.out.println("内容:"+newString(ch,start,length));
}
}
}
3Dom4j解析
Dom4j解析是第三开源库给出的解析方式,结合了Dom和SAX双方的优点,对xml文件逐步读入内存,并且可以采用面向对象的方式访问节点。代码如下:
/**
*读取属性值
**/
publicvoidreadAttr()throwsDocumentException{
Documentdoc=getDocument();
Listlist=doc.getRootElement().elements("书");
for(inti=0;ilist=doc.getRootElement().elements("书");
Elementelement=list.get(0);
ElementpriceEl=element.element("售价");
priceEl.setText("888元");
XMLWriterwriter=newXMLWriter(newFileOutputStream("./app/src/main/java/test/Dom4j3.xml"));
writer.write(doc);
}
/**
*删除节点
**/
publicvoiddeletePrice()throwsException{
SAXReaderreader=newSAXReader();
Documentdoc=reader.read("./app/src/main/java/test/Dom4j1.xml");
Elementel=(Element)doc.getRootElement().elements("书").get(1);
ElementelPrice=(Element)el.elements("售价").get(1);
elPrice.getParent().remove(elPrice);
XMLWriterwriter=newXMLWriter(newFileOutputStream("./app/src/main/java/test/Dom4j2.xml"));
writer.write(doc);
writer.close();
}
/**
*增加节点
**/
publicvoidaddEl()throwsDocumentException,IOException{
Documentdoc=getDocument();
Elementel=(Element)doc.getRootElement().elements("书").get(1);
el.addElement("售价").setText("6.66元");
XMLWriterwriter=newXMLWriter(newFileOutputStream("./app/src/main/java/test/Dom4j1.xml"));
writer.write(doc);
writer.close();
}
privateDocumentgetDocument()throwsDocumentException{
SAXReaderreader=newSAXReader();
returnreader.read("./app/src/main/java/test/DTD.xml");
}
结合以上三种解析方式的特点,我们可以得出结论:如果xml文件很小,可以选择面向对象的Dom或者dom4j方式;反之可以选择SAX方式,一面实际内存不足造成闪退。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。