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

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

Android編程簡易實(shí)現(xiàn)XML解析的方法詳解

2019-12-12 02:17:43
字體:
供稿:網(wǎng)友

本文實(shí)例講述了Android編程簡易實(shí)現(xiàn)XML解析的方法。分享給大家供大家參考,具體如下:

首先創(chuàng)建在Android工程中創(chuàng)建一個(gè)Assets文件夾 app/src/main/assets

在這里添加一個(gè)名為 data.xml的文件,然后編輯這個(gè)文件,加入如下XML格式內(nèi)容

<?xml version="1.0" encoding="utf-8"?><apps>  <app>    <id>1</id>    <name>Google Maps</name>    <version>1.0</version>  </app>  <app>    <id>2</id>    <name>Chrome</name>    <version>2.1</version>  </app>  <app>    <id>3</id>    <name>Google play</name>    <version>2.3</version>  </app></apps>

==============獲取XML中內(nèi)容================

  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    try {      //獲取XML文件的輸入流      InputStream fis = getResources().getAssets().open("data.xml");      InputStreamReader isr = new InputStreamReader(fis, "UTF-8");      StringBuffer stringBuffer = new StringBuffer();      int mark = -1;      while ((mark = isr.read()) != -1) {        stringBuffer.append((char) mark);      }      String data = stringBuffer.toString();      //把整個(gè)文件內(nèi)容以String方式傳入      //parseXMLWithPull(data);      //parseXMLWithSAX(data);    } catch (IOException e) {      e.printStackTrace();    }  }

==============Pull解析方式=================

獲取解析工具XmlPullParser:

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xmlPullParser = factory.newPullParser();

傳入XML字符流:

xmlPullParser.setInput(new StringReader(xmlData));

根據(jù)節(jié)點(diǎn)特征進(jìn)行處理:

switch ( xmlPullParser.getEventType() )
  private void parseXMLWithPull(String xmlData) {    try {      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();      XmlPullParser xmlPullParser = factory.newPullParser();      xmlPullParser.setInput(new StringReader(xmlData));      int eventType = xmlPullParser.getEventType();      String id = "";      String name = "";      String version = "";      while (eventType != xmlPullParser.END_DOCUMENT) {        String nodeName = xmlPullParser.getName();        switch (eventType) {          //開始解析某個(gè)節(jié)點(diǎn)          case XmlPullParser.START_TAG: {            if ("id".equals(nodeName)) {              id = xmlPullParser.nextText();            } else if ("name".equals(nodeName)) {              name = xmlPullParser.nextText();            } else if ("version".equals(nodeName)) {              version = xmlPullParser.nextText();            }          }          break;          //完成解析某個(gè)節(jié)點(diǎn)          case XmlPullParser.END_TAG: {            if ("app".equals(nodeName)) {              Log.d("woider", "id is " + id);              Log.d("woider", "name is " + name);              Log.d("woider", "version is " + version);            }          }          break;        }        eventType = xmlPullParser.next();      }    } catch (Exception e) {      e.printStackTrace();    }  }

==============SAX解析方式=================

使用SAX解析通常需要?jiǎng)?chuàng)建一個(gè)類繼承DefaultHandler,并重寫父類的五個(gè)方法

startDocument():開始XML解析的時(shí)候調(diào)用
startElement():開始解析某個(gè)結(jié)點(diǎn)的時(shí)候調(diào)用
characters():獲取節(jié)點(diǎn)中內(nèi)容的時(shí)候調(diào)用
endElement():完成解析某個(gè)節(jié)點(diǎn)的時(shí)候調(diào)用
endDocument():完成整個(gè)XML解析的時(shí)候調(diào)用

public class ContentHandler extends DefaultHandler {  private String nodeName;  private StringBuilder id;  private StringBuilder name;  private StringBuilder version;  @Override  public void startDocument() throws SAXException {    id = new StringBuilder();    name = new StringBuilder();    version = new StringBuilder();  }  @Override  public void startElement(String uri, String localName, String qName, Attributes attributes)      throws SAXException {    //記住當(dāng)前結(jié)點(diǎn)名    nodeName = localName;  }  @Override  public void characters(char[] ch, int start, int length) throws SAXException {    //進(jìn)行格式規(guī)范化    String str = new String(ch, start, length).trim();    //根據(jù)當(dāng)前節(jié)點(diǎn)名添加內(nèi)容    if ("id".equals(nodeName)) {      id.append(str);    } else if ("name".equals(nodeName)) {      name.append(str);    } else if ("version".equals(nodeName)) {      version.append(str);    }  }  @Override  public void endElement(String uri, String localName, String qName) throws SAXException {    if ("app".equals(localName)) {      Log.d("woider", "id is " + id);      Log.d("woider", "name is " + name);      Log.d("woider", "version is " + version);      //清空StringBuilder      id.setLength(0);      name.setLength(0);      version.setLength(0);    }  }  @Override  public void endDocument() throws SAXException {  }}

獲取解析工具XMLReader:

SAXParserFactory factory = SAXParserFactory.newInstance();XMLReader xmlReader = factory.newSAXParser().getXMLReader();

傳入規(guī)則到解析工具:

ContentHandler handler = new ContentHandler();xmlReader.setContentHandler(handler);

開始執(zhí)行解析:

xmlReader.parse(new InputSource(new StringReader(xmlData)));
  private void parseXMLWithSAX(String xmlData) {    try {      SAXParserFactory factory = SAXParserFactory.newInstance();      XMLReader xmlReader = factory.newSAXParser().getXMLReader();      ContentHandler handler = new ContentHandler();      //將ContentHandler的實(shí)例設(shè)置到XMLReader中      xmlReader.setContentHandler(handler);      //開始執(zhí)行解析      xmlReader.parse(new InputSource(new StringReader(xmlData)));    } catch (Exception e) {      e.printStackTrace();    }  }

方法二(直接針對(duì)InputStream解析)

獲取解析工具SAXParser:

SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();

獲取規(guī)則和輸入流:

handler = new ParserHandler();InputStream inputStream = getResources().getAssets().open("data.xml");

同時(shí)傳入開始解析:

parser.parse(inputStream, handler);

最后打印 LogCat 中的日志,data.xml的解析就完成了

除了 Pull 解析和 SAX 解析之外,還有一種 DOM 解析也非常重要。

另外還有一些XML解析工具,比如 JDOM 和 DOM4J,它們簡化了解析的步驟,提高了解析的效率。

PS:這里再為大家提供幾款關(guān)于xml操作的在線工具供大家參考使用:

在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.VeVB.COm/code/xmljson

在線格式化XML/在線壓縮XML
http://tools.VeVB.COm/code/xmlformat

XML在線壓縮/格式化工具:
http://tools.VeVB.COm/code/xml_format_compress

XML代碼在線格式化美化工具:
http://tools.VeVB.COm/code/xmlcodeformat

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android操作XML數(shù)據(jù)技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 富平县| 扎赉特旗| 依兰县| 平果县| 遵义市| 鄯善县| 玛纳斯县| 湟源县| 镇远县| 古交市| 鄱阳县| 会昌县| 桂平市| 炎陵县| 竹山县| 阿荣旗| 嘉义市| 西乌珠穆沁旗| 页游| 九寨沟县| 昭通市| 清徐县| 黑龙江省| 柏乡县| 扎鲁特旗| 台北县| 正定县| 庐江县| 长沙县| 明光市| 普格县| 巫溪县| 资阳市| 武强县| 安徽省| 客服| 化德县| 临猗县| 云霄县| 桐梓县| 石屏县|