您好,登錄后才能下訂單哦!
前言
xml 是數據傳輸的一種格式,Android 中的布局文件、設置文件等都采用它來表示。Android 中對 xml 文件的解析也有多種方式,下面介紹常用的 3 種方式: Dom 、 SAX 和 dom4j。下面話不多說了,來一起看看詳細的介紹吧。
先看一個簡單的 xml 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <書 出版社="駿馬"> <書名>如何成功</書名> <作者>uniapp</作者> <售價>666</售價> </書> <書> <書名>如何成功1</書名> <作者>uniapp</作者> <售價>1991</售價> </書> </書架>
1、Dom解析方式
Dom 解析通過 Document 類將整個 xml 文件一次讀入內存,然后通過操作 Document 實例的屬性實現對 xml 文件中元素的增刪改查,具體代碼如下:
2 SAX解析
SAX 對 xml 文件采用邊讀邊解析的方式,就像我們用眼睛讀文章一樣,一行一行的進行。相比 Dom 方式產生的瞬時內存峰值,SAX 對內存的消耗比較平穩。它通過解析類提供對外接口,具體實現:
public class SaxDemo { @Test public void main() throws ParserConfigurationException, SAXException, IOException{ //工廠類實例 SAXParserFactory fac = SAXParserFactory.newInstance(); //創建解析器 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("文檔結束"); } 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("元素結束: " + qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if (isPrice){ System.out.println("內容: " + new String(ch, start, length)); } } }
3 Dom4j 解析
Dom4j 解析是第三開源庫給出的解析方式,結合了 Dom 和 SAX 雙方的優點,對 xml 文件逐步讀入內存,并且可以采用面向對象的方式訪問節點。代碼如下:
/** * 讀取屬性值 * */ 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("結果: " + att.getName() + att.getValue()); } } /** * 讀取節點 * */ 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); } /** * 刪除節點 * */ 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(); } /** * 增加節點 * */ 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"); }
結合以上三種解析方式的特點,我們可以得出結論:如果 xml 文件很小,可以選擇面向對象的 Dom 或者 dom4j 方式;反之可以選擇 SAX 方式,一面實際內存不足造成閃退。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。