转自http://blog.csdn.net/sam_zhang1984
解析XML有两种方式:SAX和DOM。它们各有利弊。
DOM是把XML文档全部装载到内存中,然后当成一树进行处理。其好处是当成树处理起来比较方便,但弊端是如果XML文件比较大时,会对内存消耗比较大;
SAX是逐行扫描XML文档,逐行解析,而且可以在处理XML文档过程中的任意时刻中止处理过程,比如找到我们的目标节点,剩下的XML文档内容就可以不读了,直接结束。其弊端是操作起来相对不方便,而且对XML文档进行处理,如果修改、新增、删除等操作比较不方便。
SAX是事件驱动型XML解析的一个标准接口。它的工作原理是读到文档的开始与结束、标签元素的开始与结束、内容实体等地方时,触发相应的函数,我们就可以在相应的函数中进行我们所要进行的处理。
XML解析主要需要进行下列步骤:
1.创建事件处理程序
2.创建SAX解析器
3.将事件处理程序分配给解析器
4.对文档进行解析,将每个事件发送给处理程序。
以下的代码是MainActivity.java中的代码
packagecom.example.xml; importjava.io.StringReader; importjavax.xml.parsers.SAXParserFactory; importcom.example.utils.HttpDownloader; importorg.xml.sax.InputSource; importorg.xml.sax.XMLReader; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; public class MainActivity extendsActivity { /**Called when the activity is first created. */ privateButton parseButton ; @Override public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); parseButton =(Button)findViewById(R.id.parseButton); parseButton.setOnClickListener(newParseButtonListener()); } class ParseButtonListener implementsOnClickListener{ public voidonClick(View v) { HttpDownloader hd = newHttpDownloader(); String resultStr = hd.download("http://192.168.1.107:8081/voa1500/test.xml"); System.out.println(resultStr); try{ //创建一个SAXParserFactory SAXParserFactory factory =SAXParserFactory.newInstance(); XMLReader reader =factory.newSAXParser().getXMLReader(); //为XMLReader设置内容处理器 reader.setContentHandler(newMyContentHandler()); //开始解析文件 reader.parse(new InputSource(newStringReader(resultStr))); } catch(Exception e){ e.printStackTrace(); } } } }
以下的代码是MyContentHandler.java中的代码
packagecom.example.xml; importorg.xml.sax.Attributes; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; public class MyContentHandler extendsDefaultHandler { String hisname, address, money, sex, status; String tagName; public void startDocument() throwsSAXException { System.out.println("````````begin````````"); } public void endDocument() throwsSAXException { System.out.println("````````end````````"); } public voidstartElement(String namespaceURI, String localName, String qName, Attributes attr) throwsSAXException { tagName =localName; if (localName.equals("worker")) { //获取标签的全部属性 for (int i = 0; i < attr.getLength(); i++) { System.out.println(attr.getLocalName(i) + "=" +attr.getValue(i)); } } } public voidendElement(String namespaceURI, String localName, String qName) throwsSAXException { //在workr标签解析完之后,会打印出所有得到的数据 tagName = ""; if (localName.equals("worker")) { this.printout(); } } public void characters(char[] ch, int start, intlength) throwsSAXException { if (tagName.equals("name")) hisname = newString(ch, start, length); else if (tagName.equals("sex")) sex = newString(ch, start, length); else if (tagName.equals("status")) status = newString(ch, start, length); else if (tagName.equals("address")) address = newString(ch, start, length); else if (tagName.equals("money")) money = newString(ch, start, length); } private voidprintout() { System.out.print("name: "); System.out.println(hisname); System.out.print("sex: "); System.out.println(sex); System.out.print("status: "); System.out.println(status); System.out.print("address: "); System.out.println(address); System.out.print("money: "); System.out.println(money); System.out.println(); } }
以下的代码是FileUtils.java中的代码
packagecom.example.utils; importjava.io.File; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importandroid.os.Environment; public classFileUtils { privateString SDPATH; publicString getSDPATH() { returnSDPATH; } publicFileUtils() { //得到当前外部存储设备的目录 ///SDCARD SDPATH = Environment.getExternalStorageDirectory() + "/"; } /** * 在SD卡上创建文件 * * @throwsIOException */ public File creatSDFile(String fileName) throwsIOException { File file = new File(SDPATH +fileName); file.createNewFile(); returnfile; } /** * 在SD卡上创建目录 * * @paramdirName */ publicFile creatSDDir(String dirName) { File dir = new File(SDPATH +dirName); dir.mkdirs(); returndir; } /** * 判断SD卡上的文件夹是否存在 */ public booleanisFileExist(String fileName){ File file = new File(SDPATH +fileName); returnfile.exists(); } /** * 将一个InputStream里面的数据写入到SD卡中 */ publicFile write2SDFromInput(String path,String fileName,InputStream input){ File file = null; OutputStream output = null; try{ creatSDDir(path); file = creatSDFile(path +fileName); output = newFileOutputStream(file); byte buffer [] = new byte[4 * 1024]; int len=-1; while((len=input.read(buffer)) != -1){ //在这里使用另一个重载,防止流写入的问题. output.write(buffer,0,len); } output.flush(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ output.close(); } catch(Exception e){ e.printStackTrace(); } } returnfile; } }
以下的代码是HttpDownloader.java中的代码
packagecom.example.utils; importjava.io.BufferedReader; importjava.io.File; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; importjava.net.URL; public classHttpDownloader { private URL url = null; /** * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容 * 1.创建一个URL对象 * 2.通过URL对象,创建一个HttpURLConnection对象 * 3.得到InputStram * 4.从InputStream当中读取数据 * @paramurlStr * @return */ publicString download(String urlStr) { StringBuffer sb = newStringBuffer(); String line = null; BufferedReader buffer = null; try{ //创建一个URL对象 url = newURL(urlStr); //创建一个Http连接 HttpURLConnection urlConn =(HttpURLConnection) url .openConnection(); //使用IO流读取数据 buffer = new BufferedReader(newInputStreamReader(urlConn .getInputStream())); while ((line = buffer.readLine()) != null) { sb.append(line); } } catch(Exception e) { e.printStackTrace(); } finally{ try{ buffer.close(); } catch(Exception e) { e.printStackTrace(); } } returnsb.toString(); } /** * 该函数返回整形 -1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在 */ public intdownFile(String urlStr, String path, String fileName) { InputStream inputStream = null; try{ FileUtils fileUtils = newFileUtils(); if (fileUtils.isFileExist(path +fileName)) { return 1; } else{ inputStream =getInputStreamFromUrl(urlStr); File resultFile =fileUtils.write2SDFromInput(path,fileName, inputStream); if (resultFile == null) { return -1; } } } catch(Exception e) { e.printStackTrace(); return -1; } finally{ try{ inputStream.close(); } catch(Exception e) { e.printStackTrace(); } } return 0; } /** * 根据URL得到输入流 * * @paramurlStr * @return * @throwsMalformedURLException * @throwsIOException */ publicInputStream getInputStreamFromUrl(String urlStr) throwsMalformedURLException, IOException { url = newURL(urlStr); HttpURLConnection urlConn =(HttpURLConnection) url.openConnection(); InputStream inputStream =urlConn.getInputStream(); returninputStream; } }
以下的代码是activity_main.xml中的代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/parseButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开始解析XML"/> </LinearLayout>