基于sax的xml解析 含源码 各种工具类(一)

前端之家收集整理的这篇文章主要介绍了基于sax的xml解析 含源码 各种工具类(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1. 服务器端很简单直接在上次的服务器端代码上的Webcontent添加itcast.xml(在网上找的一个xml)

2.客户端搭建,主要流程如下

非主线程(Thread):使用HttpURLConnection请求服务器端的xml文件流数据,返回后,使用自定义的sax解析该流数据(xml)。

主线程: handler中,更新自定义adapter,最后刷新listView。

首先该xml很简单,有三个标识,id,name,age

使用一个简单的Bean进行封装。

代码如下:

  1. public class Person {
  2.  
  3. private String id;//id
  4. private int age;//年龄
  5. private String name;//姓名
  6. public Person() {
  7. // TODO Auto-generated constructor stub
  8. }
  9. public String getId() {
  10. return id;
  11. }
  12. public void setId(String id) {
  13. this.id = id;
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public Person(String id,int age,String name) {
  28. super();
  29. this.id = id;
  30. this.age = age;
  31. this.name = name;
  32. }
  33. @Override
  34. public String toString() { //便于测试
  35. return "Person [id=" + id + ",age=" + age + ",name=" + name + "]";
  36. }
  37. }
HttpUtils工具类,用于请求流数据,返回一个流数据,方便解析。不多说,前面几个博客有介绍:
  1. public class HttpUtils {
  2. private static final String path="http://192.168.0.179:8080/Myweb/itcast.xml";
  3. public HttpUtils() {
  4. // TODO Auto-generated constructor stub
  5. }
  6. public static InputStream getXML()
  7. {
  8. InputStream inputStream=null;
  9. try {
  10. URL url=new URL(path);
  11. if(url!=null)
  12. {
  13. HttpURLConnection connection=(HttpURLConnection)url.openConnection();
  14. connection.setConnectTimeout(3000);
  15. connection.setDoInput(true);
  16. connection.setDoOutput(true);
  17. connection.setRequestMethod("GET");
  18. int code=connection.getResponseCode();
  19. if(code==200)
  20. {
  21. inputStream=connection.getInputStream();
  22. }
  23. }
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. return inputStream;
  28. }
  29.  
  30. }
parserXMLUtils 类封装了sax解析方法
  1. public class parserXMLUtils {
  2.  
  3. public parserXMLUtils() {
  4. }
  5. public static List<Person> XMLParser(InputStream in,String nodename) {
  6. SAXParserFactory spf= SAXParserFactory.newInstance();//获取一个工厂实例
  7. try {
  8. SAXParser parser=spf.newSAXParser();//创建SAXParser
  9. //真正的解析类,xmlHandler
  10. xmlHandler handler=new xmlHandler(nodename);
  11. //解析
  12. parser.parse(in,handler);
  13. in.close();
  14. return handler.getList();
  15. } catch (ParserConfigurationException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. } catch (SAXException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. return null;
  26. }
  27.  
  28. }
xmlHandler才是真正的解析类:
  1. </pre><pre name="code" class="java">public class xmlHandler extends DefaultHandler {
  2. private List<Person>list=null;
  3. private Person person=null;
  4. private String curTag=null;
  5. private String curValueString=null;
  6. private String nodeName=null;
  7. private static final String TAG="xmlHandler";
  8. public xmlHandler(String NodeName) {
  9. this.nodeName=NodeName;
  10. }
  11. //开始解析文档
  12. @Override
  13. public void startDocument() throws SAXException {
  14. // TODO Auto-generated method stub
  15. list=new ArrayList<Person>();
  16. super.startDocument();
  17. }
  18. //第一个元素
  19. @Override
  20. public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
  21. if (qName.equals(nodeName)) {
  22. person=new Person();
  23. Log.d(TAG,qName);
  24. }
  25. if((attributes!=null)&&person!=null)
  26. {
  27. for(int i=0;i<attributes.getLength();i++)
  28. {
  29. if(attributes.getQName(i).equals("id"))
  30. {
  31. Log.d(TAG,attributes.getValue(i));
  32. person.setId(attributes.getValue(i));
  33. }
  34. }
  35. }
  36. curTag=qName;
  37. }
  38. //每一个元素的属性
  39. @Override
  40. public void characters(char[] ch,int start,int length)
  41. throws SAXException {
  42. if((curTag!=null)&&(person!=null))
  43. {
  44. curValueString=new String(ch,start,length);
  45. Log.d(TAG,curValueString);
  46. if((curValueString!=null)&&(curValueString.trim()!="")&&(curValueString.trim()!="\n")){
  47. Log.d(TAG,curValueString);
  48. if(curTag.equals("age"))
  49. {
  50. int year=Integer.parseInt(curValueString);
  51. person.setAge(year);
  52. }
  53. else if(curTag.equals("name"))
  54. {
  55. person.setName(curValueString);
  56. }
  57. }
  58. curTag=null;
  59. curValueString=null;
  60. }
  61. }
  62. //一个元素解析完成
  63. @Override
  64. public void endElement(String uri,String qName) throws SAXException {
  65. if(qName.equals(nodeName)&&(person!=null))
  66. {
  67. list.add(person);
  68. person=null;
  69. }
  70. super.endElement(uri,localName,qName);
  71. };
  72. public List<Person> getList() {
  73. return list;
  74. }
  75.  
  76. }
以上,如果你使用过iOS的xml解析,是不是发觉很类似,iOS是使用delegate来回调,这个是使用接口回调。

具体调用和UI部分及源码见下一个部分。

猜你在找的XML相关文章