国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android XML數(shù)據(jù)的三種解析方式

2020-02-21 17:21:15
字體:
供稿:網(wǎng)友

Android中有很多解析XML文件的方法,而XML是一種數(shù)據(jù)傳輸格式,我們通常都用Android中的布局文件和設(shè)置文件,本文是武林技術(shù)頻道小編帶來的Android XML數(shù)據(jù)的三種解析方式,一起來學(xué)習(xí)吧!

三種解析方式的步驟:

1.在Assets文件夾中模擬創(chuàng)建XML數(shù)據(jù)
2.創(chuàng)建對應(yīng)XML的Bean對象
3.開始解析

XML數(shù)據(jù)的Dom解析

DOM解析XML文件時,會將XML文件的所有內(nèi)容讀取到內(nèi)存中(內(nèi)存的消耗比較大),然后允許您使用DOM API遍歷XML樹、檢索所需的數(shù)據(jù)

一、在Assets文件夾中模擬創(chuàng)建XML文件

<students> <student>  <name sex="man">小明</name>  <nickName>明明</nickName> </student> <student>  <name sex="woman">小紅</name>  <nickName>紅紅</nickName> </student> <student>  <name sex="man">小亮</name>  <nickName>亮亮</nickName> </student></students>

二、創(chuàng)建對應(yīng)XML的Bean對象

public class Student { private String name; private String sex; private String nickName; public String getName() {  return name; } public void setName(String name) {  this.name = name; } public String getSex() {  return sex; } public void setSex(String sex) {  this.sex = sex; } public String getNickName() {  return nickName; } public void setNickName(String nickName) {  this.nickName = nickName; } @Override public String toString() {  return "Student{" +    "name='" + name + '/'' +    ", sex='" + sex + '/'' +    ", nickName='" + nickName + '/'' +    '}'; }}

三、Dom解析

public List<Student> dom2xml(InputStream is) throws Exception { //一系列的初始化 List<Student> list = new ArrayList<>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); //獲得Document對象 Document document = builder.parse(is); //獲得student的List NodeList studentList = document.getElementsByTagName("student"); //遍歷student標(biāo)簽 for (int i = 0; i < studentList.getLength(); i++) {  //獲得student標(biāo)簽  Node node_student = studentList.item(i);  //獲得student標(biāo)簽里面的標(biāo)簽  NodeList childNodes = node_student.getChildNodes();  //新建student對象  Student student = new Student();  //遍歷student標(biāo)簽里面的標(biāo)簽  for (int j = 0; j < childNodes.getLength(); j++) {   //獲得name和nickName標(biāo)簽   Node childNode = childNodes.item(j);   //判斷是name還是nickName   if ("name".equals(childNode.getNodeName())) {    String name = childNode.getTextContent();    student.setName(name);    //獲取name的屬性    NamedNodeMap nnm = childNode.getAttributes();    //獲取sex屬性,由于只有一個屬性,所以取0    Node n = nnm.item(0);    student.setSex(n.getTextContent());   } else if ("nickName".equals(childNode.getNodeName())) {    String nickName = childNode.getTextContent();    student.setNickName(nickName);   }  }  //加到List中  list.add(student); } return list;}

XML數(shù)據(jù)的Sax解析

SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,SAX解析XML文件采用的是事件驅(qū)動,它并不需要解析完整個文檔,而是按內(nèi)容順序解析文檔的過程

由于前面一和二的步驟是一樣的,這里就省略了

三、Sax解析

?

public List<Student> sax2xml(InputStream is) throws Exception { SAXParserFactory spf = SAXParserFactory.newInstance(); //初始化Sax解析器 SAXParser sp = spf.newSAXParser(); //新建解析處理器 MyHandler handler = new MyHandler(); //將解析交給處理器 sp.parse(is, handler); //返回List return handler.getList();}public class MyHandler extends DefaultHandler { private List<Student> list; private Student student; //用于存儲讀取的臨時變量 private String tempString; /**  * 解析到文檔開始調(diào)用,一般做初始化操作  *  * @throws SAXException  */ @Override public void startDocument() throws SAXException {  list = new ArrayList<>();  super.startDocument(); } /**  * 解析到文檔末尾調(diào)用,一般做回收操作  *  * @throws SAXException  */ @Override public void endDocument() throws SAXException {  super.endDocument(); } /**  * 每讀到一個元素就調(diào)用該方法  *  * @param uri  * @param localName  * @param qName  * @param attributes  * @throws SAXException  */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  if ("student".equals(qName)) {   //讀到student標(biāo)簽   student = new Student();  } else if ("name".equals(qName)) {   //獲取name里面的屬性   String sex = attributes.getValue("sex");   student.setSex(sex);  }  super.startElement(uri, localName, qName, attributes); } /**  * 讀到元素的結(jié)尾調(diào)用  *  * @param uri  * @param localName  * @param qName  * @throws SAXException  */ @Override public void endElement(String uri, String localName, String qName) throws SAXException {  if ("student".equals(qName)) {   list.add(student);  }  if ("name".equals(qName)) {   student.setName(tempString);  } else if ("nickName".equals(qName)) {   student.setNickName(qName);  }  super.endElement(uri, localName, qName); } /**  * 讀到屬性內(nèi)容調(diào)用  *  * @param ch  * @param start  * @param length  * @throws SAXException  */ @Override public void characters(char[] ch, int start, int length) throws SAXException {  tempString = new String(ch, start, length);  super.characters(ch, start, length); } /**  * 獲取該List  *  * @return  */ public List<Student> getList() {  return list; }}

XML數(shù)據(jù)的Pull解析

Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,可以使用一個switch對感興趣的事件進行處理

三、Pull解析

?

public List<Student> pull2xml(InputStream is) throws Exception { List<Student> list = null; Student student = null; //創(chuàng)建xmlPull解析器 XmlPullParser parser = Xml.newPullParser(); ///初始化xmlPull解析器 parser.setInput(is, "utf-8"); //讀取文件的類型 int type = parser.getEventType(); //無限判斷文件類型進行讀取 while (type != XmlPullParser.END_DOCUMENT) {  switch (type) {   //開始標(biāo)簽   case XmlPullParser.START_TAG:    if ("students".equals(parser.getName())) {     list = new ArrayList<>();    } else if ("student".equals(parser.getName())) {     student = new Student();    } else if ("name".equals(parser.getName())) {     //獲取sex屬性     String sex = parser.getAttributeValue(null,"sex");     student.setSex(sex);     //獲取name值     String name = parser.nextText();     student.setName(name);    } else if ("nickName".equals(parser.getName())) {     //獲取nickName值     String nickName = parser.nextText();     student.setNickName(nickName);    }    break;   //結(jié)束標(biāo)簽   case XmlPullParser.END_TAG:    if ("student".equals(parser.getName())) {     list.add(student);    }    break;  }  //繼續(xù)往下讀取標(biāo)簽類型  type = parser.next(); } return list;}

Activity中使用三種解析

public class XmlActivity extends AppCompatActivity implements View.OnClickListener { private TextView tv; private Button bt_dom, bt_sax, bt_pull; private XmlUtils xmlUtils; private List<Student> students; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_xml);  tv = (TextView) findViewById(R.id.tv);  bt_dom = (Button) findViewById(R.id.bt_dom);  bt_sax = (Button) findViewById(R.id.bt_sax);  bt_pull = (Button) findViewById(R.id.bt_pull);  bt_dom.setOnClickListener(this);  bt_sax.setOnClickListener(this);  bt_pull.setOnClickListener(this);  xmlUtils = new XmlUtils(); } @Override public void onClick(View v) {  switch (v.getId()) {   case R.id.bt_dom:    try {     students = xmlUtils.dom2xml(getResources().getAssets().open("student.xml"));     tv.setText(students.toString());    } catch (Exception e) {     e.printStackTrace();    }    break;   case R.id.bt_sax:    try {     students = xmlUtils.sax2xml(getResources().getAssets().open("student.xml"));     tv.setText(students.toString());    } catch (Exception e) {     e.printStackTrace();    }    break;   case R.id.bt_pull:    try {     students = xmlUtils.pull2xml(getResources().getAssets().open("student.xml"));     tv.setText(students.toString());    } catch (Exception e) {     e.printStackTrace();    }    break;  } }}

三種解析方式的效果圖是一樣的

Sax解析與Pull解析區(qū)別

SAX和Pull的區(qū)別:SAX解析器的工作方式是自動將事件推入事件處理器進行處理,因此你不能控制事件的處理主動結(jié)束;而Pull解析器的工作方式為允許你的應(yīng)用程序代碼主動從解析器中獲取事件,正因為是主動獲取事件,因此可以在滿足了需要的條件后不再獲取事件,結(jié)束解析。

總的來說,相信各位朋友們看了Android XML數(shù)據(jù)的三種解析方式的介紹之后已經(jīng)有所了解了。如果還想了解更多的相關(guān)資訊,那么就關(guān)注js.Vevb.com吧!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永年县| 容城县| 扶沟县| 青海省| 台江县| 屯门区| 咸宁市| 扎赉特旗| 连山| 新乡市| 大理市| 乐山市| 镇宁| 栾城县| 三穗县| 深圳市| 五华县| 婺源县| 永平县| 瓦房店市| 盘山县| 竹北市| 永泰县| 海晏县| 神农架林区| 贞丰县| 固安县| 安乡县| 陈巴尔虎旗| 民和| 沂水县| 当阳市| 淳化县| 隆昌县| 清水河县| 深水埗区| 鹰潭市| 内乡县| 易门县| 垦利县| 苏州市|