Android开发学习第五天

Android中解析xml文件的方法

1、SAX:Simple API for XML

2、DOM:Document Object Model

3、pull

SAX解析XML文件

SAX是一个解析速度快并且占用内存少的XML解析器。SAX解析XML文件采用的是事件驱动,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到字符是否符合XML语法中的某部分,如果符合触发事件(回调函数,定义在ContentHandler接口中)。

ContentHandler接口常用方法

startDocument()

当遇到文档的开头时候,调用这个方法,可以在该方法中进行预处理工作。

endDocument()

当文档结束的时候,调用这个方法,可以在该方法中进行善后工作。

startElement()

当读到一个开始标签的时候,会触发该方法。

endElement()

当遇到结束标签的时候,会调用该方法。

characters()

该方法用来处理在XML文件中读到的内容。

使用SAX读取XML文件时许创建一个类实现ContentHandler接口,此外我们可以编写一个类继承

DefaultHandler类,然后重写里面的方法:

SAXParserFactory spf = SAXParseFactory newInstance();

SAXParser saxParser = spf.newSAXParser();

XMLContentHandler handler = new XMLContentHandler();

saxParser.parse(inStream,handler);
public class XMLContentHandler{
  private List<Person> persons;
  private Person person;
  private String preTag;
  
  public List<Person> getPersons(){
      return persons;
  }
  
   @Override
  public void startDocument() throws SAXException{
      persons = new ArrayList<Person>();
  }
   /**
     *uri:命名空间
     *localName:不带命名空间前缀的标签名
     *qName:带命名空间前缀的标签名
     *attributes:属性集合
     */
     @Override
  public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException{
     if("person".equals(localName)){
         person = new Person();
         person.setId(new Integer(attributes.getValue("id")));
     }
      preTag = localName;
  }
    /**
      *ch[]:内容
      *start:起始位置
      *length:长度
      */
      @Override
  public void characters(char[] ch,int start,int length) throws SAXException{
     if(person!=null){
       String data = new String(ch,start,length);
         if("name".equals(preTag)){
             person.setName(data);
         }else if("age".equals(preTag)){
             person.setAge(new Short(data));
         }
     }
  }
      @Override
  public void endElement(String uri,String localName,String qName) throws SAXException{
    if("person".equals(LocalName)&&person!=null){
        persons.add(person);
        person = null;
    }
      preTag = null;
  }
    
       @Override
  public void endDocument() throws SAXException{
  }
    
}
<?xml version="1.0" encoding="UTF-8"?>
<persions xmlns:pre="http://www.baidu.com">
  <pre:person id="001">
    <name>coolszy</name>
    <age>22</age>
  </pre:persion>
  <pre:person id="002">
    <name>kuka</name>
    <age>22</age>
  </pre:persion>
</persions>

DOM解析XML文件

Dom解析是将xml文件全部载入,组装成一棵dom树,然后通过节点以及节点之间的关系来解析xml文件。对于特别大的文档,解析和加载整个文档可能很慢并且耗费资源。

public class DOMPersonService{

public static List<Person> readXml(InputStream in) throw IOExecption{
   public static List<Person> persons = new ArrayList<Person>();
   //实例化一个文档构造器工厂
   DocumentBuilderFactory factory = DocumentBuliderFactory.newInstacnce();
   //通过文档构建器工厂获取一个文档构建器
   DocumentBuilder  builder = factory.newDocumentBuilder();
   //通过文档构建器创建一个文档实例
   Document document = builder.parse(in);
   Element root = document.getDocumentElement();
   NodeList nodes = root.getElementsByTagName("pre:person");
   for(int i=0;i<nodes.getLength();i++){
      Element personElement =(Element)nodes.item(i);
      Person person = new Person();
      person.setId(Integer.valueOf(personElement.getAttribute("id")));
      NodeList childNodes = personElement.getChildNodes();
       //注意 子节点不为2,空格也算入
      for(int j=0;j<childNodes.getLength();j++){
        Node childNode =(Node) childNodes.item(j);
        if(childNode.getNodeType() == Node.ELEMENT_NODE){
            Element childElement = (Element)childNode;
            if("name".equals(childElement.getNodeName())){
            person.setName(childElement.getFirstChild().getNodeValue());
            }else{
                person.setAge(new Short(childElement.getFirstChild().getNodeValue()));
            }
        }
      
      }
       persons.add(person);
   }
    return persons;
   }
}

Pull解析XML文件

Pull解析和SAX解析类似,都是轻量级的解析,Android内核中已经嵌入pull,不需要添加第三方jar来支持

(1)pull读取xml文件后触发相应的事件调用方法返回的是数字。

(2)pull可以在程序中控制想解析到哪里就可以停止解析。

public class DOMPersonService{

public static List<Person> readXml(InputStream in) throw IOExecption{
   public static List<Person> persons = null;
   XmlPullParser parser =Xml.newPullParser();
   parser.setInput(in,"UTF-8");
   int eventCode = parser.getEventType();
   Person person =null;
   while(eventCode !=XmlPullParser.END_DOCUMENT){//判断文档是否结束
        switch(eventCode){
           case XMLPullParser.START_DOCUMENT: //0文档开始事件
               persons = new ArrayList<Person>();
               break;
           case XMLPullParser.START_TAGL: //2开始元素
               if("person".equals(parser.getName())){
                   person = new Person();
                   person.setId(new Integer(parser.getAttributeValue(0)));
               }
                else if(null != person){
                    if("name".equals(parser.getName())){
                        person.setName(parser.nextText());
                    }else if("age".equals(parser.getName())){
                         person.setAge(parser.nextText());
                    }
                }
                break;
            case XmlPullParser.END_TAG://结束元素
                if("person".equals(parser.getName())&&person!=null){
                    persons.add(person);
                    person = null;
                }
                break;
        }
       eventCode =parser.next();
   }
  return persons;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值