安卓和JAVA解析xml文件的三种方式:
1、PULL解析
2、SAX解析
3、DOM解析
三者各有所长,依情况选择解析方式
1、PULL和SAX均采用流式解析,意味着只能从头读到底,无法像DOM解析一样随机访问xml文件中的任意一个节点
2、PULL和SAX占用更少的内存解析,更适用于安卓上的解析xml文件
3、DOM解析时将文件全部解析完,最后让用户任意取特定的信息
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面学习PULL解析方式。(PULL方法的简洁性是它最大的优势)
1、解析本地xml文件
1 public class PullParser { 2 3 public List<Worker> pullParsers() throws XmlPullParserException, IOException 4 { 5 List<Worker> list = null; 6 Worker worker = null; 7 //第一步:创建XML解析对象,需要通过工厂模式创建类的实例 8 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 9 XmlPullParser parser = factory.newPullParser(); 10 // 第二步:设置待解析的xml数据源 11 FileInputStream fis = new FileInputStream("worker.xml"); 12 parser.setInput(fis,"utf-8"); 13 // 第三步:获取当前xml标签的事件类型 14 int event = parser.getEventType(); 15 // 第四步:通过分支语句处理不同的事件标签 16 while(event!=XmlPullParser.END_DOCUMENT) 17 { 18 19 switch(event) 20 { 21 // 第五步:获取标签名称,处理标签信息 22 case XmlPullParser.START_DOCUMENT://解析文件开始,创建列表集合对象 23 list = new ArrayList<Worker>(); 24 break; 25 case XmlPullParser.START_TAG: 26 String tagName = parser.getName(); 27 if("worker".equals(tagName)) 28 { 29 worker = new Worker(); 30 int count = parser.getAttributeCount();//得到属性的个数 31 for(int i=0;i<count;i++) 32 { 33 String attrName = parser.getAttributeName(i); 34 String attrValue = parser.getAttributeValue(i); 35 if("id".equals(attrName)) 36 worker.setId(attrValue); 37 } 38 } 39 else if("name".equals(tagName)) 40 worker.setName(parser.nextText()); 41 worker.setMoney(Double.parseDouble(parser.nextText())); 42 break; 43 44 case XmlPullParser.END_TAG://解析文件结束, 45 if("worker".equals(parser.getName())) 46 { 47 // 第六步:将处理的数据保存到JavaBean或Map对象中 48 list.add(worker); 49 worker = null; 50 } 51 break; 52 } 53 // 第七步:获取下一个标签的事件类型,判断事件类型是否为文档结束事件,如果是则退出,反之重复第四、五、六步 54 event = parser.next(); 55 } 56 return list; 57 } 58 59 /** 60 * @param args 61 * @throws IOException 62 * @throws XmlPullParserException 63 */ 64 public static void main(String[] args) throws XmlPullParserException, IOException { 65 PullParser pullParser = new PullParser(); 66 List<Worker> list = pullParser.pullParsers(); 67 68 for(Worker w:list) 69 { 70 System.out.println(w); 71 } 72 } 73 74 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <workers> 3 <worker id="AQ01"> 4 <name>Mark</name> 5 </worker> 6 <worker id="AD02"> 7 <name>Luch</name> 8 </worker> 9 <worker id="AD03"> 10 <name>Lily</name> 11 </worker> 12 <worker id="AD04"> 13 <name>Lily</name> 14 </worker> 15 </workers>
1 package com.qianfeng.pullparser2; 2 3 public class Worker { 4 5 private String id; 6 private String name; 7 8 public Worker() { 9 super(); 10 // TODO Auto-generated constructor stub 11 } 12 public Worker(String id, String name) { 13 super(); 14 this.id = id; 15 this.name = name; 16 17 } 18 public String getId() { 19 return id; 20 } 21 public void setId(String id) { 22 this.id = id; 23 } 24 public String getName() { 25 return name; 26 } 27 public void setName(String name) { 28 this.name = name; 29 } 30 31 @Override 32 public String toString() { 33 return "Worker [id=" + id + ", name=" + name + "]"; 34 } 35 }
解析效果:
1 Worker [id=AQ01, name=Mark] 2 Worker [id=AD02, name=Luch] 3 Worker [id=AD03, name=Lily] 4 Worker [id=AD04, name=Lily]
2、解析服务器的xml文件
1 package pull; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import org.xmlpull.v1.XmlPullParser; 9 import org.xmlpull.v1.XmlPullParserException; 10 import org.xmlpull.v1.XmlPullParserFactory; 11 12 public class Pull { 13 14 /** 15 * @param args 16 * @throws XmlPullParserException 17 * @throws IOException 18 */ 19 public static void main(String[] args) throws XmlPullParserException, IOException { 20 // TODO Auto-generated method stub 21 List<Person> list = null; 22 Person person=null; 23 24 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 25 XmlPullParser parser = factory.newPullParser(); 26 String path ="http://localhost:8080/aaa/person.xml"; 27 InputStream in = HttpUtil.getInputStream(path); 28 parser.setInput(in, "utf-8"); 29 int event = parser.getEventType(); 30 while(event!=XmlPullParser.END_DOCUMENT) 31 { 32 switch(event) 33 { 34 case XmlPullParser.START_DOCUMENT: 35 System.out.println("文件解析开始"); 36 list = new ArrayList<Person>(); 37 break; 38 case XmlPullParser.START_TAG: 39 String str = parser.getName(); 40 if("person".equals(str)) 41 { 42 person = new Person(); 43 int count = parser.getAttributeCount(); 44 for(int i=0;i<count;i++) 45 { 46 String key = parser.getAttributeName(i); 47 String value = parser.getAttributeValue(i); 48 if("id".equals(key)) 49 { 50 person.setName(value); 51 } 52 } 53 } 54 else if("name".equals(str)) 55 { 56 person.setName(parser.nextText()); 57 } 58 break; 59 case XmlPullParser.END_TAG: 60 if("person".equals(parser.getName())) 61 { 62 list.add(person); 63 person=null; 64 } 65 break; 66 } 67 event = parser.next(); 68 69 } 70 71 for(int i=0;i<list.size();i++) 72 { 73 System.out.println(list); 74 } 75 76 77 } 78 79 }
对应的HttpUtil自定义类getInpustStream方法
1 package pull; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.HttpURLConnection; 6 import java.net.MalformedURLException; 7 import java.net.URL; 8 9 public class HttpUtil { 10 public static InputStream getInputStream(String path) throws IOException{ 11 URL url = new URL(path); 12 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 13 conn.setRequestMethod("GET"); 14 conn.setConnectTimeout(5000); 15 conn.setDoInput(true); 16 if(conn.getResponseCode() ==200) 17 { 18 InputStream in = conn.getInputStream(); 19 return in; 20 } 21 22 23 return null; 24 25 } 26 27 }
解析效果:
1 文件解析开始 2 [Pserson [id=0, name=张老师, age=0], Pserson [id=0, name=李老师, age=0]] 3 [Pserson [id=0, name=张老师, age=0], Pserson [id=0, name=李老师, age=0]]