zoukankan      html  css  js  c++  java
  • 0120 xml解析+SAX

    0120 rss解析新闻的标准 xml 解析 可以得到想要的信息 什么是sax  另一种是dom SAX是逐行的解析方式 可以随时停止解析 但是,操作复杂,添加删除费劲

    sax全称simple api for xml是一个接口,也是一个软件包 作为接口,有c++ 和java等的实现、sax是以事件为驱动的解析的过程

    开始解析一个标签了,会通知一个函数

    在实现类中覆盖四个接口的方法 ContentHandler ErrorHandler DTDHandler EntityResolver

    对于如下文档 <doc> <para>Hello,world!</para></doc> 在解析过程中会产生如下事件 start document start element:doc start element :para character:Hello,world! end element:para end element:doc end document 我们要做的就是写上产生这些事件的代码 ContentHandler 接口是解析xm的主体

    1,创建一个SAXParaseFactory SAXParserFactory factory =SAXPaserfactory.newInstance(); 2,getXMLReader()得到reader xmlReader reader=factory.newSAXParser().getXMLReader(); 3,为XMLReader设置内容处理器 为XMLReader设置内容处理器 reader.setContentReader(new MyContentHandler()); 开始解析文件  reader.parse(new InputSource(new StringReader(ResultStr)));

    ContentHandler方法非常多,但是我们又不需要实现这么多方法来复写接口 比如只想实现其中5个方法 采用适配器设计方法(我们使用一个类,里面的方法都实现接口里面的方法,但是都是空方法) 现在只要继承这个DefaultHandler 我们可以只复写其中5个方法,其他的由于已经DefaultHandler已经提供了空方法

    StringReader()以流的方式来处理一个字符窜

    startElement(String namespaceURI,String localname,Sring qName,Attributes attr) namespaceURI 当前正在解析的标签的命名空间 localname 得到的标签不包含前缀 qname是得到前缀<abc:name>  abc就是前缀

    获取标签的全部属性 attr.getLocalName(i) 得到第i个属性的名字 attr.getValue(i)得到第i个属性的值

    startElement() 开始解析一个标签

    一边读取一边解析,适合手机开发

    XML_Test.java

     1 package com.example.xml_test;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.io.StringReader;
     6 
     7 import javax.xml.parsers.ParserConfigurationException;
     8 import javax.xml.parsers.SAXParserFactory;
     9 
    10 import org.xml.sax.InputSource;
    11 import org.xml.sax.SAXException;
    12 import org.xml.sax.XMLReader;
    13 
    14 import com.example.utils.HttpDownloader;
    15 
    16 import android.os.Bundle;
    17 import android.app.Activity;
    18 import android.view.Menu;
    19 import android.view.View;
    20 import android.view.View.OnClickListener;
    21 import android.widget.Button;
    22 
    23 public class XML_Test extends Activity {
    24 
    25     private Button parseButton;
    26     @Override
    27     protected void onCreate(Bundle savedInstanceState) {
    28         super.onCreate(savedInstanceState);
    29         setContentView(R.layout.activity_xml__test);
    30         parseButton=(Button)findViewById(R.id.parseButton);
    31         parseButton.setOnClickListener(new ParseButtonListener());
    32     }
    33     class ParseButtonListener implements OnClickListener{
    34 
    35         @Override
    36         public void onClick(View v) {
    37             // TODO Auto-generated method stub
    38             HttpDownloader hd=new HttpDownloader();
    39             
    40                 String resultStr = null;
    41                 try {
    42                     resultStr = hd.download("http://192.168.1.107:8081/voa1500/test.xml");
    43                 } catch (IOException e1) {
    44                     // TODO Auto-generated catch block
    45                     e1.printStackTrace();
    46                 }
    47             
    48             try {
    49             //创建一个SAXParserFactory
    50                 SAXParserFactory factory=SAXParserFactory.newInstance();
    51                 XMLReader reader=factory.newSAXParser().getXMLReader();
    52                 //为XMLReader设置内容处理器
    53                 reader.setContentHandler(new MyContentHandler());
    54                 //开始解析文件
    55                 reader.parse(new InputSource(new StringReader(resultStr)));
    56             } catch (Exception e) {
    57                 // TODO Auto-generated catch block
    58                 e.printStackTrace();
    59             }
    60             
    61             
    62         }
    63         
    64         
    65     }
    66     
    67 
    68 
    69 
    70 }

    MyContentHandler.java

     1 package com.example.xml_test;
     2 
     3 import org.xml.sax.Attributes;
     4 import org.xml.sax.helpers.DefaultHandler;
     5 
     6 public class MyContentHandler extends DefaultHandler{
     7     /**
     8      * ContentHandler方法非常多,但是我们又不需要实现这么多方法来复写接口
     9      *比如只想实现其中5个方法
    10      *采用适配器设计方法(我们使用一个类,里面的方法都实现接口里面的方法,但是都是空方法)
    11      *现在只要继承这个DefaultHandler
    12      *我们可以只复写其中5个方法,其他的由于已经DefaultHandler已经提供了空方法 
    13      */
    14     String tagName,sex,hisname,status,address,money;
    15     public void startDocument()
    16     {
    17         System.out.println("--begin--");
    18         
    19     }
    20     
    21     public void endDocument()
    22     {
    23         System.out.println("--end--");
    24     }
    25     
    26     //namespaceURI 当前正在解析的标签的命名空间 localname 得到的标签不包含前缀 
    27     //qname是得到前缀<abc:name>  abc就是前缀
    28    //遇到标签开始解析一个标签就会调用此函数,就算开始读取第二个标签比如<name>还是要调用这个函数
    29     public void startElement(String namespaceURI, String localName,
    30             String qName, Attributes attr)
    31     {
    32         tagName=localName;
    33         if(localName.equals("worker"))
    34         {
    35             for(int i=0;i<attr.getLength();i++)//getLength();Return the number of attributes in the list.
    36             {
    37                 System.out.println(attr.getLocalName(i)+attr.getValue(i));
    38             }
    39         }
    40         /**
    41          * attr.getLocalName(i) 得到第i个属性的名字 id,name
    42          *attr.getValue(i)得到第i个属性的值 123 ,zhangsan
    43          *<worker id=123,name="zhangsan">
    44          */
    45         
    46     }
    47     //当一个标签解析完后就会调用此函数
    48     public void endElement(String namespaceURI, String localName, String qName)
    49     {
    50         tagName="";
    51         if(localName.equals("worker"))//到了最后一个标签
    52         {this.printout();}
    53         
    54         
    55     }
    56     //字符数组(即标签) ,起始点,结束点
    57     //读取标签的内容时候就要调用characters方法<name>zhangsan</name> 读取zhangsan时候就要调用这个
    58     public void characters (char[] ch, int start, int length)
    59     {
    60         //判断来自哪个标签
    61         if (tagName.equals("name"))
    62             hisname = new String(ch, start, length);
    63         else if (tagName.equals("sex"))
    64             sex = new String(ch, start, length);
    65         else if (tagName.equals("status"))
    66             status = new String(ch, start, length);
    67         else if (tagName.equals("address"))
    68             address = new String(ch, start, length);
    69         else if (tagName.equals("money"))
    70             money = new String(ch, start, length);
    71         
    72     }
    73     
    74     
    75     
    76     
    77     public void printout()
    78     {
    79         System.out.print("name: ");
    80         System.out.println(hisname);
    81         System.out.print("sex: ");
    82         System.out.println(sex);
    83         System.out.print("status: ");
    84         System.out.println(status);
    85         System.out.print("address: ");
    86         System.out.println(address);
    87         System.out.print("money: ");
    88         System.out.println(money);
    89         System.out.println();
    90     }
    91 }

  • 相关阅读:
    做数据库维修工、还是码农,讨论走下神坛的职业【摘自vage】
    4.4 Web存储
    4.3 createjs
    4.2 HTML Canvas标签
    4.2 拖放
    4.1 HTML5 音频
    3.2 JacaScript面向对象
    3.1 JavaScript基础
    2.7 CSS动画
    2.6 CSS基本操作
  • 原文地址:https://www.cnblogs.com/kyxyes/p/2926382.html
Copyright © 2011-2022 走看看