Android中對xml文件解析的3種方式總結(jié)
前言
xml 是數(shù)據(jù)傳輸?shù)囊环N格式,Android 中的布局文件、設(shè)置文件等都采用它來表示。Android 中對 xml 文件的解析也有多種方式,下面介紹常用的 3 種方式: Dom 、 SAX 和 dom4j。下面話不多說了,來一起看看詳細(xì)的介紹吧。
先看一個簡單的 xml 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <書 出版社="駿馬"> <書名>如何成功</書名> <作者>uniapp</作者> <售價>666</售價> </書> <書> <書名>如何成功1</書名> <作者>uniapp</作者> <售價>1991</售價> </書> </書架>
1、Dom解析方式
Dom 解析通過 Document 類將整個 xml 文件一次讀入內(nèi)存,然后通過操作 Document 實例的屬性實現(xiàn)對 xml 文件中元素的增刪改查,具體代碼如下:
2 SAX解析
SAX 對 xml 文件采用邊讀邊解析的方式,就像我們用眼睛讀文章一樣,一行一行的進(jìn)行。相比 Dom 方式產(chǎn)生的瞬時內(nèi)存峰值,SAX 對內(nèi)存的消耗比較平穩(wěn)。它通過解析類提供對外接口,具體實現(xiàn):
public class SaxDemo {
@Test
public void main() throws ParserConfigurationException, SAXException, IOException{
//工廠類實例
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("文檔開始");
}
@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("元素開始: " + qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("售價".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 解析是第三開源庫給出的解析方式,結(jié)合了 Dom 和 SAX 雙方的優(yōu)點,對 xml 文件逐步讀入內(nèi)存,并且可以采用面向?qū)ο蟮姆绞皆L問節(jié)點。代碼如下:
/**
* 讀取屬性值
* */
public void readAttr() throws DocumentException {
Document doc = getDocument();
List<Element> list = doc.getRootElement().elements("書");
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é)點
* */
public void read() throws DocumentException {
/**
* 不能越級獲取值
* */
Document doc = getDocument();
org.dom4j.Element el = doc.getRootElement();
Element firstEl = el.element("書");
Element firstBookEl = firstEl.element("書名");
String name = firstBookEl.getText();
System.out.println("書名: " + name);
}
public void update() throws DocumentException, IOException {
Document doc = getDocument();
List<Element> list = doc.getRootElement().elements("書");
Element element = list.get(0);
Element priceEl = element.element("售價");
priceEl.setText("888元");
XMLWriter writer = new XMLWriter(new FileOutputStream("./app/src/main/java/test/Dom4j3.xml"));
writer.write(doc);
}
/**
* 刪除節(jié)點
* */
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("書").get(1);
Element elPrice = (Element) el.elements("售價").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é)點
* */
public void addEl() throws DocumentException, IOException {
Document doc = getDocument();
Element el = (Element) doc.getRootElement().elements("書").get(1);
el.addElement("售價").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é)合以上三種解析方式的特點,我們可以得出結(jié)論:如果 xml 文件很小,可以選擇面向?qū)ο蟮?Dom 或者 dom4j 方式;反之可以選擇 SAX 方式,一面實際內(nèi)存不足造成閃退。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
5分鐘學(xué)會Android設(shè)計模式之策略模式Strategy Pattern教程
這篇文章主要為大家介紹了5分鐘學(xué)會Android設(shè)計模式之策略模式Strategy Pattern教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Android關(guān)于Button背景或樣式失效問題解決方法
大家好,本篇文章主要講的是Android關(guān)于Button背景或樣式失效問題解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Java4Android開發(fā)教程(一)JDK安裝與配置
本文是Android開發(fā)系列教程的第一篇,主要為大家?guī)淼氖情_發(fā)環(huán)境的準(zhǔn)備工作,JDK安裝與配置圖文教程,非常的詳細(xì),有需要的朋友可以參考下2014-10-10
Android jni調(diào)試打印char陣列的實例詳解
這篇文章主要介紹了Android jni調(diào)試打印char陣列的實例詳解的相關(guān)資料,通過此文希望能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
Android Activity之間相互調(diào)用與傳遞參數(shù)的原理與用法分析
這篇文章主要介紹了Android Activity之間相互調(diào)用與傳遞參數(shù)的原理與用法,較為詳細(xì)的分析了Android組件的構(gòu)成以及Activity的創(chuàng)建、調(diào)用、切換等相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
Android開發(fā)InputManagerService創(chuàng)建與啟動流程
這篇文章主要為大家介紹了Android開發(fā)InputManagerService創(chuàng)建與啟動流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android自定義TextView仿微信朋友圈文字展開全文功能
這篇文章主要為大家詳細(xì)介紹了Android自定義TextView仿微信朋友圈文字展開全文功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06

