Android中對(duì)xml文件解析的3種方式總結(jié)
前言
xml 是數(shù)據(jù)傳輸?shù)囊环N格式,Android 中的布局文件、設(shè)置文件等都采用它來(lái)表示。Android 中對(duì) xml 文件的解析也有多種方式,下面介紹常用的 3 種方式: Dom 、 SAX 和 dom4j。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
先看一個(gè)簡(jiǎn)單的 xml 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <書(shū) 出版社="駿馬"> <書(shū)名>如何成功</書(shū)名> <作者>uniapp</作者> <售價(jià)>666</售價(jià)> </書(shū)> <書(shū)> <書(shū)名>如何成功1</書(shū)名> <作者>uniapp</作者> <售價(jià)>1991</售價(jià)> </書(shū)> </書(shū)架>
1、Dom解析方式
Dom 解析通過(guò) Document 類將整個(gè) xml 文件一次讀入內(nèi)存,然后通過(guò)操作 Document 實(shí)例的屬性實(shí)現(xiàn)對(duì) xml 文件中元素的增刪改查,具體代碼如下:
2 SAX解析
SAX 對(duì) xml 文件采用邊讀邊解析的方式,就像我們用眼睛讀文章一樣,一行一行的進(jìn)行。相比 Dom 方式產(chǎn)生的瞬時(shí)內(nèi)存峰值,SAX 對(duì)內(nèi)存的消耗比較平穩(wěn)。它通過(guò)解析類提供對(duì)外接口,具體實(shí)現(xiàn):
public class SaxDemo { @Test public void main() throws ParserConfigurationException, SAXException, IOException{ //工廠類實(shí)例 SAXParserFactory fac = SAXParserFactory.newInstance(); //創(chuàng)建解析器 SAXParser parser = fac.newSAXParser(); //解析文檔 XMLReader reader = parser.getXMLReader(); reader.setContentHandler(new MyDefultHandle()); reader.parse("./app/src/main/java/test/DTD.xml"); } } class MyDefultHandle extends DefaultHandler{ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("文檔開(kāi)始"); } @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("文檔結(jié)束"); } private boolean isPrice = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); System.out.println("元素開(kāi)始: " + qName); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if ("售價(jià)".equals(qName)){ isPrice = false; } System.out.println("元素結(jié)束: " + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if (isPrice){ System.out.println("內(nèi)容: " + new String(ch, start, length)); } } }
3 Dom4j 解析
Dom4j 解析是第三開(kāi)源庫(kù)給出的解析方式,結(jié)合了 Dom 和 SAX 雙方的優(yōu)點(diǎn),對(duì) xml 文件逐步讀入內(nèi)存,并且可以采用面向?qū)ο蟮姆绞皆L問(wèn)節(jié)點(diǎn)。代碼如下:
/** * 讀取屬性值 * */ public void readAttr() throws DocumentException { Document doc = getDocument(); List<Element> list = doc.getRootElement().elements("書(shū)"); for (int i = 0; i < list.size(); i++) { Element el = (Element) list.get(i); Attribute att = el.attribute("出版社"); System.out.print("結(jié)果: " + att.getName() + att.getValue()); } } /** * 讀取節(jié)點(diǎn) * */ public void read() throws DocumentException { /** * 不能越級(jí)獲取值 * */ Document doc = getDocument(); org.dom4j.Element el = doc.getRootElement(); Element firstEl = el.element("書(shū)"); Element firstBookEl = firstEl.element("書(shū)名"); String name = firstBookEl.getText(); System.out.println("書(shū)名: " + name); } public void update() throws DocumentException, IOException { Document doc = getDocument(); List<Element> list = doc.getRootElement().elements("書(shū)"); Element element = list.get(0); Element priceEl = element.element("售價(jià)"); priceEl.setText("888元"); XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j3.xml")); writer.write(doc); } /** * 刪除節(jié)點(diǎn) * */ public void deletePrice() throws Exception{ SAXReader reader = new SAXReader(); Document doc = reader.read("./app/src/main/java/test/Dom4j1.xml"); Element el = (Element) doc.getRootElement().elements("書(shū)").get(1); Element elPrice = (Element) el.elements("售價(jià)").get(1); elPrice.getParent().remove(elPrice); XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j2.xml")); writer.write(doc); writer.close(); } /** * 增加節(jié)點(diǎn) * */ public void addEl() throws DocumentException, IOException { Document doc = getDocument(); Element el = (Element) doc.getRootElement().elements("書(shū)").get(1); el.addElement("售價(jià)").setText("6.66元"); XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j1.xml")); writer.write(doc); writer.close(); } private Document getDocument() throws DocumentException { SAXReader reader = new SAXReader(); return reader.read("./app/src/main/java/test/DTD.xml"); }
結(jié)合以上三種解析方式的特點(diǎn),我們可以得出結(jié)論:如果 xml 文件很小,可以選擇面向?qū)ο蟮?Dom 或者 dom4j 方式;反之可以選擇 SAX 方式,一面實(shí)際內(nèi)存不足造成閃退。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android?XML數(shù)據(jù)解析要點(diǎn)介紹
- Android中的xml解析介紹
- Android實(shí)現(xiàn)向本地寫(xiě)入一個(gè)XML文件和解析XML文件
- 淺談Android Studio 解析XML的三種方法
- Android解析XML文件升級(jí)APK的方法
- Android開(kāi)發(fā)中解析xml文件XmlUtils工具類與用法示例
- Android編程簡(jiǎn)易實(shí)現(xiàn)XML解析的方法詳解
- Android xml解析實(shí)例詳解
- Android開(kāi)發(fā)筆記XML數(shù)據(jù)解析方法及優(yōu)缺點(diǎn)
相關(guān)文章
Android studio 生成帶Kotlin文檔的實(shí)現(xiàn)方式
這篇文章主要介紹了Android studio 生成帶Kotlin文檔的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android 實(shí)現(xiàn)電話來(lái)去自動(dòng)錄音的功能
本文主要介紹Android 電話自動(dòng)錄音功能的開(kāi)發(fā),這里提供實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖,有需要的小伙伴可以參考下2016-08-08詳解android 通過(guò)uri獲取bitmap圖片并壓縮
這篇文章主要介紹了詳解android 通過(guò)uri獲取bitmap圖片并壓縮的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下2017-10-10Android startService的使用與Service生命周期案例詳解
這篇文章主要介紹了Android startService的使用與Service生命周期案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09解決Eclipse創(chuàng)建android項(xiàng)目無(wú)法正常預(yù)覽布局文件問(wèn)題的方法
這篇文章主要介紹了解決Eclipse創(chuàng)建android項(xiàng)目無(wú)法正常預(yù)覽布局文件問(wèn)題的方法,需要的朋友可以參考下2015-12-12Android入門(mén)之SubMenu的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)SubMenu子菜單的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Android有一定的幫助,感興趣的可以了解一下2022-11-11Android使用ListView實(shí)現(xiàn)滾輪的動(dòng)畫(huà)效果實(shí)例
這篇文章主要介紹了Android使用ListView實(shí)現(xiàn)滾輪的動(dòng)畫(huà)效果實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06