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;i list=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方式,一面实际内存不足造成闪退。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。