Android中對(duì)xml文件解析的3種方式總結(jié)

前言

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)寧鄉(xiāng),十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575

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ì)創(chuàng)新互聯(lián)的支持。

網(wǎng)頁(yè)名稱:Android中對(duì)xml文件解析的3種方式總結(jié)
文章源于:http://bm7419.com/article22/psdojc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、ChatGPT、App設(shè)計(jì)、虛擬主機(jī)網(wǎng)站設(shè)計(jì)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)