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

首頁 > 系統 > Android > 正文

淺談Android Studio 解析XML的三種方法

2019-10-21 21:44:10
字體:
來源:轉載
供稿:網友

一丶概述

文件解析要求,json解析和xml解析,前面文章說過Json轉實體類,這里就說說解析XML

內容:

Android Studio 解析XML常見的三種方式:DOM PULL SAX (實現XML轉實體類并打印輸出)

效果演示:

Android,Studio,XML

二丶正文

SAX(Simple API for XML) 使用流式處理的方式,它并不記錄所讀內容的相關信息。它是一種以事件為驅動的XML API,解析速度快,占用內存少。使用回調函數來實現。 缺點是不能倒退。

DOM(Document Object Model) 是一種用于XML文檔的對象模型,可用于直接訪問XML文檔的各個部分。它是一次性全部將內容加載在內存中,生成一個樹狀結構,它沒有涉及回調和復雜的狀態管理。 缺點是加載大文檔時效率低下。

Pull內置于Android系統中。也是官方解析布局文件所使用的方式。Pull與SAX有點類似,都提供了類似的事件,如開始元素和結束元素。不同的是,SAX的事件驅動是回調相應方法,需要提供回調的方法,而后在SAX內部自動調用相應的方法。而Pull解析器并沒有強制要求提供觸發的方法。因為他觸發的事件不是一個方法,而是一個數字。它使用方便,效率高。

SAX、DOM、Pull的比較: 

1. 內存占用:SAX、Pull比DOM要好; 
2. 編程方式:SAX采用事件驅動,在相應事件觸發的時候,會調用用戶編好的方法,也即每解析一類XML,就要編寫一個新的適合該類XML的處理類。DOM是W3C的規范,Pull簡潔。 
3. 訪問與修改:SAX采用流式解析,DOM隨機訪問。 
4. 訪問方式:SAX,Pull解析的方式是同步的,DOM逐字逐句

這里不做詳細講解,看注釋,上代碼

看項目文件,注意XML放的位置,不會建assets參考http://www.survivalescaperooms.com/article/144766.htm

Android,Studio,XML

XML

<?xml version="1.0" encoding="UTF-8" ?><persons>  <person id="23">    <name>李雷</name>    <age>30</age>  </person>  <person id="20">    <name>韓梅梅</name>    <age>25</age>  </person></persons>

person.Java

public class Person {  Integer id;  String name;  Short age;  public Integer getId() {    return id;  }  public void setId(Integer id) {    this.id = id;  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public Short getAge() {    return age;  }  public void setAge(Short age) {    this.age = age;  }  @Override  public String toString() {    return "Person{" +        "id=" + id +        ", name='" + name + '/'' +        ", age=" + age +        '}';  }}

XMLtoEntityActivity

public class XMLtoEntityActivity extends AppCompatActivity {  private TextView tv_show_entity;  private String string = "";  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.xmlto_entity_activity);    tv_show_entity = (TextView) findViewById(R.id.tv_show_entity);  }  public void startXML(View view){//    SAXService saxService = new SAXService();//    DOMService domService = new DOMService();    PULLService pullService = new PULLService();    try {      InputStream inputStream = getAssets().open("Users.xml");//      List<Person> persons = saxService.getPerson(inputStream);//      List<Person> persons = domService.getPersons(inputStream);      List<Person> persons = pullService.getPersons(inputStream);      for (Person person : persons) {        Log.e("TAG",person.toString());        string += person.toString();      }    } catch (IOException e) {      e.printStackTrace();    } catch (Exception e) {      e.printStackTrace();    }    tv_show_entity.setText(string);  }}

DOM方法

/** * 采用DOM解析XML內容 */public class DOMService {  public List<Person> getPersons(InputStream inputStream) throws Exception {    List<Person> persons = new ArrayList<>();    //獲取DOM解析器工廠    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();    //獲DOM解析器    DocumentBuilder builder = factory.newDocumentBuilder();    //將解析樹放入內存,通過返回值Document來描述結果    Document document = builder.parse(inputStream);    //取得根元素<personos>    Element root = document.getDocumentElement();    //取得所有person節點集合    NodeList personNodes = root.getElementsByTagName("person");    for (int i = 0; i < personNodes.getLength(); i++) {      Person person = new Person();      //取得person節點元素      Element personElement = (Element) personNodes.item(i);      //取得屬性值并設置ID      person.setId(Integer.parseInt(personElement.getAttribute("id")));      //獲取person的子節點      NodeList personChilds = personElement.getChildNodes();      for (int j = 0; j < personChilds.getLength(); j++) {        //判斷當前節點是否是元素類型的節點        if (personChilds.item(j).getNodeType() == Node.ELEMENT_NODE) {          Element childElement = (Element) personChilds.item(j);          if ("name".equals(childElement.getNodeName())) {            //獲取孫節點的值            person.setName(childElement.getFirstChild().getNodeValue());          } else if ("age".equals(childElement.getNodeName())) {            person.setAge(Short.parseShort(childElement.getFirstChild().getNodeValue()));          }        }      }      persons.add(person);    }    return persons;  }}

PULL方法

/** * 采用PULL解析XML內容 */public class PULLService {  public List<Person> getPersons(InputStream inputStream) throws Exception {    List<Person> persons = null;    Person person = null;    //得到PULL解析器    XmlPullParser parser = Xml.newPullParser();    parser.setInput(inputStream,"UTF-8");    //產生事件    int eventType = parser.getEventType();    //如果不是文檔結束事件就循環推進    while (eventType != XmlPullParser.END_DOCUMENT) {      switch (eventType) {        case XmlPullParser.START_DOCUMENT://開始文檔事件          persons = new ArrayList<>();          break;        case XmlPullParser.START_TAG://開始元素事件          //獲取解析器當前指向的元素的名稱          String name = parser.getName();          if ("person".equals(name)) {            person = new Person();            person.setId(Integer.parseInt(parser.getAttributeValue(0)));          }          if (person != null) {            if ("name".equals(name)) {              //獲取解析器當前指向元素的下一個文本節點的值              person.setName(parser.nextText());            }            if ("age".equals(name)) {              person.setAge(Short.parseShort(parser.nextText()));            }          }          break;        case XmlPullParser.END_TAG://結束元素事件          //判斷是都是person的結束事件          if ("person".equals(parser.getName())) {            persons.add(person);            person = null;          }          break;      }      //進入下一個元素并觸發相應的事件      eventType = parser.next();    }    return persons;  }}

SAX方法

/** * 采用SAX解析XML內容 */public class SAXService {  public List<Person> getPerson(InputStream inputStream) throws Exception {    //得到SAX解析工廠    SAXParserFactory factory = SAXParserFactory.newInstance();    //得到SAX解析器    SAXParser parser = factory.newSAXParser();    PersonParser personParser = new PersonParser();    parser.parse(inputStream,personParser);    inputStream.close();    return personParser.getPersons();  }  private final class PersonParser extends DefaultHandler {    private List<Person> persons = null;    private String tag = null;//記錄當前解析到了那個元素節點名稱    private Person person;    public List<Person> getPersons(){      return persons;    }    //一開始會執行這個方法,所以在這里面完成初始化    @Override    public void startDocument() throws SAXException {      persons = new ArrayList<>();    }    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {      //判斷元素節點是否等于person      if ("person".equals(localName)) {        person = new Person();        //獲取數據,參數為索引下標        person.setId(Integer.parseInt(attributes.getValue(0)));      }      tag = localName;    }    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {      if ("person".equals(localName)) {        persons.add(person);        person = null;      }      tag = null;    }    @Override    public void characters(char[] ch, int start, int length) throws SAXException {      if (tag != null) {        //獲取文本節點的數據        String data = new String(ch, start, length);        if ("name".equals(tag)) {          person.setName(data);        } else if ("age".equals(tag)) {          person.setAge(Short.parseShort(data));        }      }    }  }}

總結:Android開發主流是傳json,而XML解析一般跟網絡請求,爬蟲數據相關。當然兩者也是可以相互轉換的,Java只強大在于提供了很多的類和方法。只要你愿意學,方法總是有的

源碼下載歡迎Star(updating):https://github.com/JinBoy23520/CoderToDeveloperByTCLer

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙田区| 天等县| 麦盖提县| 招远市| 嘉定区| 洪湖市| 永城市| 巴彦淖尔市| 天峨县| 图们市| 香港| 淳化县| 丹江口市| 莫力| 宜兰市| 青冈县| 松滋市| 睢宁县| 榆社县| 吉林省| 保定市| 新化县| 孝义市| 保康县| 渭源县| 东乡族自治县| 西宁市| 东乌珠穆沁旗| 井研县| 工布江达县| 墨竹工卡县| 桦南县| 浠水县| 祁阳县| 称多县| 米林县| 保定市| 琼海市| 平罗县| 井陉县| 桐乡市|