解析XML格式数据

前端之家收集整理的这篇文章主要介绍了解析XML格式数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Pull解析

首先获取到一个XmlPullParserFactory的实例,再调用setInput()方法将xml数据返回到当前的事件。通过getEventtype()方法可以得到当前的解析事件

  1. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  2. XmlPullParser xmlPullParser = factory.newPullParser();
  3. xmlPullParser.setInput(new StringReader(xmlData));
  4. int eventType = xmlPullParser.getEventType();

再在while循环中不断解析,如果当前事件不等于XmlPullParser.END_DOCUMENT,说明解析没有完成,调用next()方法后可以获取下一个解析事件,在循环中,用getName来获取当前节点的名字,然后调用nextText()方法获得节点内容
这里有一份准备好的数据文件


  1. while (eventType!=XmlPullParser.END_DOCUMENT){
  2. String nodeName = xmlPullParser.getName();
  3. switch (eventType){
  4. //开始解析节点
  5. case XmlPullParser.START_TAG:{
  6. if("id".equals(nodeName)){
  7. id = xmlPullParser.nextText();
  8. }else if("name".equals(nodeName)){
  9. name = xmlPullParser.nextText();
  10. }else if("version".equals(nodeName)){
  11. version = xmlPullParser.nextText();
  12. }
  13. break;
  14. }
  15. case XmlPullParser.END_TAG:{
  16. if("app".equals(nodeName)){
  17. Log.d("id",id);
  18. Log.d("name",name);
  19. Log.d("version",version);
  20. }
  21. break;
  22. }
  23. }
  24. eventType = xmlPullParser.next();
  25. }

SAX解析

SAX用法比Pull要复杂一些,但是语义方面会更加清楚。通常情况下新建一个类并且继承DefaultHandler,并重写父类的5个方法

  1. public class MyHandler extends DefaultHandler {
  2. private String nodeName;
  3. private StringBuilder id;
  4. private StringBuilder name;
  5. private StringBuilder version;
  6.  
  7. //开始XML解析时调用
  8. @Override
  9. public void startDocument() throws SAXException {
  10. id = new StringBuilder();
  11. name = new StringBuilder();
  12. version = new StringBuilder();
  13. }
  14.  
  15. //开始解析某个节点时调用
  16. @Override
  17. public void startElement(String uri,String localName,String qName,Attributes
  18. attributes) throws SAXException {
  19. nodeName = localName;
  20. }
  21.  
  22. //获取节点内容调用
  23. @Override
  24. public void characters(char[] ch,int start,int length) throws SAXException {
  25. if("id".equals(nodeName)){
  26. id.append(ch,start,length);
  27. }else if("name".equals(nodeName)){
  28. name.append(ch,length);
  29. }else if("version".equals(nodeName)){
  30. version.append(ch,length);
  31. }
  32. }
  33.  
  34. //完成解析某个节点时调用
  35. @Override
  36. public void endElement(String uri,String qName) throws
  37. SAXException {
  38. if("app".equals(nodeName)){
  39. Log.d("id",id.toString().trim());
  40. Log.d("name",name.toString().trim());
  41. Log.d("version",version.toString().trim());
  42. //清空StringBuilder
  43. id.setLength(0);
  44. name.setLength(0);
  45. version.setLength(0);
  46. }
  47. }
  48.  
  49. //完成解析XML时调用
  50. @Override
  51. public void endDocument() throws SAXException {
  52. super.endDocument();
  53. }
  54. }

接下来的工作和Pull差不多

  1. SAXParserFactory factory = SAXParserFactory.newInstance();
  2. XMLReader xmlReader = factory.newSAXParser().getXMLReader();
  3. MyHandler handler = new MyHandler();
  4. xmlReader.setContentHandler(handler);
  5. //开始执行解析
  6. xmlReader.parse(new InputSource(new StringReader(xmlData)));

猜你在找的XML相关文章