Android解析XML的三种方式SAX、Pull、Dom

2019-12-10 17:53:26王冬梅

    在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。

   另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。

   看了些基础以后开始上代码吧(核心代码,下载代码在附件)

public class SAXPraserHelper extends DefaultHandler {

 final int ITEM = 0x0005;

 List<channel> list;
 channel chann;
 int currentState = 0;

 public List<channel> getList() {
  return list;
 }

 /*
  * 接口字符块通知
*/
 @Override
 public void characters(char[] ch, int start, int length)
   throws SAXException {
  // TODO Auto-generated method stub
// super.characters(ch, start, length);
  String theString = String.valueOf(ch, start, length);
  if (currentState != 0) {
   chann.setName(theString);
   currentState = 0;
  }
  return;
 }

 /*
  * 接收文档结束通知
*/
 @Override
 public void endDocument() throws SAXException {
  // TODO Auto-generated method stub
  super.endDocument();
 }

 /*
  * 接收标签结束通知
*/
 @Override
 public void endElement(String uri, String localName, String qName)
   throws SAXException {
  // TODO Auto-generated method stub
  if (localName.equals("item"))
   list.add(chann);
 }

 /*
  * 文档开始通知
*/
 @Override
 public void startDocument() throws SAXException {
  // TODO Auto-generated method stub
  list = new ArrayList<channel>();
 }

 /*
  * 标签开始通知
*/
 @Override
 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {
  // TODO Auto-generated method stub
  chann = new channel();
  if (localName.equals("item")) {
   for (int i = 0; i < attributes.getLength(); i++) {
    if (attributes.getLocalName(i).equals("id")) {
     chann.setId(attributes.getValue(i));
    } else if (attributes.getLocalName(i).equals("url")) {
     chann.setUrl(attributes.getValue(i));
    }
   }
   currentState = ITEM;
   return;
  }
  currentState = 0;
  return;
 }
}

private List<channel> getChannelList() throws ParserConfigurationException, SAXException, IOException
 {
  //实例化一个SAXParserFactory对象
  SAXParserFactory factory=SAXParserFactory.newInstance();
  SAXParser parser;
  //实例化SAXParser对象,创建XMLReader对象,解析器
  parser=factory.newSAXParser();
  XMLReader xmlReader=parser.getXMLReader();
  //实例化handler,事件处理器
  SAXPraserHelper helperHandler=new SAXPraserHelper();
  //解析器注册事件
  xmlReader.setContentHandler(helperHandler);
  //读取文件流
  InputStream stream=getResources().openRawResource(R.raw.channels);
  InputSource is=new InputSource(stream);
  //解析文件
  xmlReader.parse(is);
  return helperHandler.getList();
 }