編輯:關於Android編程
dom 我的理解就是先把整個文檔讀取到內存中,然後才解析,讀取大點的文件的話這樣效率就會很低。而 sax和pull 它們是基於事件解析的。一行一行去解析,效率會高點。
下面就講這三種的用法:
dom解析xml sax解析xml pull解析xml首先在main創建個assets目錄,創建好後,然後在這目錄下創建個person.xml文件
person.xml裡面的內容為:
張三 22通信工程 李四 32軟件工程 王五 29土木工程
接下來我們用三種方法就解析這個內容。掌握解析了這個,其他的基本上也會了。
activity_main.xml布局文件代碼如下:
很簡單就一個按鈕,還有一個是顯示解析出來的內容,
PersonBean.java代碼如下:
public class PersonBean { private int id; private String name; private int age; private String major; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } @Override public String toString() { return "PersonBean{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", major='" + major + '\'' + '}'; } }
ParseXMLForDom.java代碼如下:
import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; /** * Created by Administrator on 2016/10/4. */ public class ParseXMLForDom { /** * dom方式解析xml */ public static ListparseXML(InputStream is) throws Exception { //獲取集合實例 List list = new ArrayList<>(); //獲取DocumentBuilderFactory實例 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //獲取documentBuilder實例 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //獲取document實例 Document document = documentBuilder.parse(is); //獲取person節點集合 NodeList personNodeList = document.getElementsByTagName("person"); for (int i = 0; i < personNodeList.getLength(); i++) { PersonBean bean = new PersonBean();//獲取personbean實例 Node person = personNodeList.item(i);//獲取person節點 NamedNodeMap nnm = person.getAttributes(); /* * 獲取person節點的屬性值 */ for (int j = 0; j < nnm.getLength(); j++) { Node n = nnm.item(j); bean.setId(Integer.valueOf(n.getNodeValue())); } /* 獲取person裡的子節點,並賦值給bean */ NodeList personChildNodeList = person.getChildNodes(); for (int j = 0; j < personChildNodeList.getLength(); j++) { //獲取person節點的子節點 Node personChileNode = personChildNodeList.item(j); if (Node.ELEMENT_NODE == personChileNode.getNodeType()) { if ("name".equals(personChileNode.getNodeName())) { bean.setName(personChileNode.getTextContent().trim()); } else if ("age".equals(personChileNode.getNodeName())) { bean.setAge(Integer.valueOf(personChileNode.getTextContent().trim())); } else if ("major".equals(personChileNode.getNodeName())) { bean.setMajor(personChileNode.getTextContent().trim()); } } } list.add(bean); } return list; } }
這個是dom解析xml,
//獲取DocumentBuilderFactory實例
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//獲取documentBuilder實例
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//獲取document實例
Document document = documentBuilder.parse(is);
這幾步是必須要,我們要拿到整個document實例才能去解析。
MainActivity.java代碼如下:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private TextView mContent; private Listlist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initWidgets();//初始化控件 } /** * 為按鈕綁定點擊事件 * * @param view */ public void parseXML(View view) { parseXMLForDom(); } /** * dom解析xml */ private void parseXMLForDom() { try { list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml")); StringBuffer sb = new StringBuffer(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i).toString() + "\n"); } mContent.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } /** * 初始化控件 */ private void initWidgets() { mContent = (TextView) findViewById(R.id.content); } }
裡面邏輯不難。就不解釋了。。
運行結果:
再創建個MyHandler類繼承DefaultHandler ,代碼如下
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/10/4. */ public class MyHandler extends DefaultHandler { private PersonBean bean; private Listlist; private String contentFlag;//只是一個標記,把值放到contentFlag中 /** * 解析到文檔開始調用,一般做初始化操作 * @throws SAXException */ @Override public void startDocument() throws SAXException { list=new ArrayList<>();//初始化list super.startDocument(); } /** * 解析到文檔末尾調用,一般做回收操作 * @throws SAXException */ @Override public void endDocument() throws SAXException { super.endDocument(); } /** * 每讀到一個元素就調用該方法 * @param uri * @param localName * @param qName * @param attributes * @throws SAXException */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //當讀到person節點時就創建一個personbean實例 if ("person".equals(qName)){ bean=new PersonBean(); String id= attributes.getValue("id"); bean.setId(Integer.valueOf(id)); } super.startElement(uri, localName, qName, attributes); } /** * 讀到元素的結尾調用 * @param uri * @param localName * @param qName * @throws SAXException */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("person".equals(qName)){ list.add(bean); bean=null;//通知jvm回收 } if ("name".equals(qName)){ bean.setName(contentFlag); }else if ("age".equals(qName)){ bean.setAge(Integer.valueOf(contentFlag)); }else if ("major".equals(qName)){ bean.setMajor(contentFlag); } contentFlag=null;//設為null super.endElement(uri, localName, qName); } /** * 讀到屬性內容調用 * @param ch * @param start * @param length * @throws SAXException */ @Override public void characters(char[] ch, int start, int length) throws SAXException { contentFlag=new String(ch,start,length).trim(); super.characters(ch, start, length); } /** * 把list暴露出去, * @return */ public List getList() { return list; } }
改下MainActivity代碼如下:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import org.xml.sax.SAXException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class MainActivity extends AppCompatActivity { private TextView mContent; private Listlist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initWidgets();//初始化控件 } /** * 為按鈕綁定點擊事件 * * @param view */ public void parseXML(View view) { // parseXMLForDom();//dom解析xml parseForXMLForSax();//sax解析xml } /** * dom解析xml */ private void parseXMLForDom() { try { list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml")); StringBuffer sb = new StringBuffer(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i).toString() + "\n"); } mContent.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } /** * sax解析xml */ public void parseForXMLForSax() { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = null; try { sp = spf.newSAXParser(); MyHandler handler = new MyHandler(); sp.parse(getResources().getAssets().open("person.xml"), handler); list = handler.getList();//這是解析出來的內容放在list集合中 StringBuffer sb = new StringBuffer(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i).toString() + "\n"); } mContent.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } /** * 初始化控件 */ private void initWidgets() { mContent = (TextView) findViewById(R.id.content); } }
運行結果是一樣的,不放出來了
sax解析大概調用方法的順序:
創建ParseXMLForPull類代碼如下:
import android.util.Xml; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/10/4. */ public class ParseXMLForPull { public static ListparseXML(InputStream is) { List list=null; PersonBean bean=null; XmlPullParser parser = Xml.newPullParser(); try { parser.setInput(is, "utf-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<>(); break; case XmlPullParser.START_TAG: if ("person".equals(parser.getName())) { bean = new PersonBean(); String id= parser.getAttributeValue(null,"id"); bean.setId(Integer.valueOf(id)); } if (bean != null) { if ("name".equals(parser.getName())) { bean.setName(parser.nextText().trim()); } else if ("age".equals(parser.getName())) { bean.setAge(Integer.valueOf(parser.nextText().trim())); } else if ("major".equals(parser.getName())) { bean.setMajor(parser.nextText().trim()); } } break; case XmlPullParser.END_TAG: if ("person".equals(parser.getName())){ list.add(bean); bean=null; } break; } eventType = parser.next(); } } catch (Exception e) { e.printStackTrace(); } return list; } }
pull也是基於事件解析的,感覺跟sax解析xml差不多、
MainActivity.java代碼如下:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import org.xml.sax.SAXException; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class MainActivity extends AppCompatActivity { private TextView mContent; private Listlist; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initWidgets();//初始化控件 } /** * 為按鈕綁定點擊事件 * * @param view */ public void parseXML(View view) { // parseXMLForDom();//dom解析xml // parseForXMLForSax();//sax解析xml parseXMLForPull();//pull解析xml } /** * dom解析xml */ private void parseXMLForDom() { try { list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml")); StringBuffer sb = new StringBuffer(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i).toString() + "\n"); } mContent.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } /** * sax解析xml */ public void parseForXMLForSax() { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = null; try { sp = spf.newSAXParser(); MyHandler handler = new MyHandler(); sp.parse(getResources().getAssets().open("person.xml"), handler); list = handler.getList();//這是解析出來的內容放在list集合中 StringBuffer sb = new StringBuffer(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i).toString() + "\n"); } mContent.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } /** * pull解析xml */ public void parseXMLForPull() { try { list= ParseXMLForPull.parseXML(getResources().getAssets().open("person.xml")); StringBuffer sb = new StringBuffer(); for (int i = 0; i < list.size(); i++) { sb.append(list.get(i).toString() + "\n"); } mContent.setText(sb.toString()); } catch (IOException e) { e.printStackTrace(); } } /** * 初始化控件 */ private void initWidgets() { mContent = (TextView) findViewById(R.id.content); } }
運行結果還是一樣的。不放出來了、
邊學邊寫,終於完成了。dom跟sax解析xml以前是學過的,pull解析xml以前沒接觸過,感覺也不是太難。哈哈。。pull解析xml沒寫什麼解釋,我感覺明白了sax解析xml,pull解析應該也會 了。
AndroidForBlog/tree/master/androidforparsexml">https://github.com/songshuilin/AndroidForBlog/tree/master/androidforparsexml
記得之前有朋友在留言裡讓我寫一篇關於沉浸式狀態欄的文章,正巧我確實有這個打算,那麼本篇就給大家帶來一次沉浸式狀態欄的微技巧講解。其實說到沉浸式狀態欄這個名字我也是感到很無
在Android系統中的應用程序,與Java的應用程序相同,都是靠消息驅動,簡單的說就是:有一個消息隊列,我們可以不斷的向這個消息隊列中添加消息,並從中取出消息,處理消息
時間悄悄的走,轉眼來實習已經三個月了,三個月的時間,小編慢慢的成長著,從剛開始的電商項目到現在的車段子項目,小編在走過一個又一個項目的同時,走過了一個又一個戰勝自己的奇跡
本文實例講述了Android中ListView下拉刷新的實現方法。分享給大家供大家參考,具體如下:ListView中的下拉刷新是非常常見的,也是經常使用的,看到有很多同學