第一行代码总结:10网络:10.3.2 SAX解析方式

10.3.2 SAX解析方式

步骤:

1、新建一个类,继承自DefaultHandler类,并复写其五个方法:

  public class ContentHandler extendsDefaultHandler{

    @Override//该方法会在开始XML解析的时候调用

    public void startDocument() throwsSAXException {}

  

    @Override //该方法会在开始解析某个结点的时候调用

    public void startElement(String uri, StringlocalName, String qName, Attributes attributes) thows SAXEception{}

 

    @Override//该方法会在获取结点内容的时候调用

    public void characters(char[] ch, intstart, int length)throws SAXException{}

 

@Override//该方法会在完成解析某个结点的时候调用

public void endElement(String uri, StringlocalName,String qName)throws SAXException{}

 

@Override//该方法会在完成整个XML解析的时候调用

public void endDocument()throws SAXException{}

 

}

注意:中间三个方法是有参数的。

      在获取结点内容时,characters()方法可能会被调用多次,一些换行符也被当作内容解析出来,我们需要针对这种情况在代码中做好控制。

2、给id,name,version结点分别定义了一个StringBuilder对象,并在startDocument()方法里对它们进行了初始化。

privateString nodeName;

privateStringBuilder id;

privateStringBuilder name;

privateStringBuilder version;

 

@Override

public voidstartDocument() throws SAXException {

  id = new StringBuilder();

  name = new StringBuilder();

  version = new StringBuilder();

}

3、每当开始解析某个结点的时候,startElement()方法就会得到调用,其中localName参数记录着当前结点的名字,这里我们把它记录下来。

@Override

public voidstartElement(String uri, String localName, String qName,Attributes attributes)throws SAXException{

  //记录当前结点名

  nodeName = localName;

}

4、接着在解析结点中具体内容的时候就会调用characters()方法,在这个方法中,我们会根据当前的结点名进行判断,将解析出的内容添加到哪一个StringBuilder对象中。

@Override

public voidcharacters(char[] ch, int start, int length) throws SAXException {

  //根据当前的结点名判断将内容添加到哪一个StringBuilder对象中

  if(“id”.equals(nodeNme)){

     id.append(ch,start,length);

  } else if ( “name”.equals(nodeName)){

     name.append(ch,start,length)

  } else if (“version”.equals(nodeName)){

     version.append(ch,start,length)

  }

}

5、最后在endElement()方法中进行判断,如果app结点已经解析完成,就打印出id,name,version的内容。

@Override

public voidendElement(String uri,String localName,String qName) throws SAXException{

  if(“app”.equals(localName)){

     Log.d(“ContentHandler”, “id is “ +id.toString.trim());

     Log.d(“ContentHandler”, “name is “ +name.toString.trim());

     Log.d(“ContentHandler”, “version is “ +version.toString.trim());

     //最后要将StringBuilder清空掉

    id.setLength(0);

     name.setLength(0);

     version.setLength(0);

  }

}

6、在MainActivity中得到了服务器返回的数据之后,调用我们自己创建的专门用SAX方式解析XML数据的方法。在这个方法当中进行着如下操作:

   (1)创建一个SAXParserFactory的对象;

   (2)然后利用该对象调用其newSAXParser()方法,得到SAXParser对象,然后再利用该对象调用其getXMLReader()方法,得到XMLReader对象。

   (3)接着将我们刚编写的ContentHandler的实例设置到XMLReader中。

   (4)最后调用parse()方法开始执行解析即可。

private voidparseXMLWithSAX(String xmlData){

  SAXParserFactory factory =SAXParserFactory.new Instance();

  XMLReader xmlReader = factory.newSAXParser().getXMLReader(); 

  ContentHandler handler = newContentHandler();

  //将ContentHandler的实例设置到XMLReader中

xmlReader.setContentHandler(handler);

//开始执行解析

  xmlReader.parse(new InputSource(newStringReader(xmlData)));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值