通过Sax方式解析xml文件
来源:互联网 发布:手机钢琴软件 编辑:程序博客网 时间:2024/05/16 07:48
说明:此案例使用的是通过Dom方式解析xml文件这篇文章里的City类和china.xml文件。
1. 因为xml文件有两种格式,一是上面那篇文章里的那种元素节点里只包含属性节点,另一种就是元素节点里包含元素节点和文本节点,于是在china.xml中添加如下代码,以实现两种方式的解析:
<city> <cityname>杭州</cityname> <pyName>zhejiang</pyName> <quName>浙江</quName> <state1>1</state1> <state2>1</state2> <stateDetailed>阴</stateDetailed> <tem1>34</tem1> <tem2>20</tem2> <windState>东北风1-2级</windState> </city>
2. 布局文件有变,用Spinner控件代替了RadioGroup控件,界面如下图:
3. 因为使用了Spinner控件,所以要在res/values文件夹下创建一个array.xml文件,用来获取Spinner控件中的item值,如下:
<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="cities"> <item>北京</item> <item>江苏</item> <item>浙江</item> </string-array> </resources>
string.xml文件中的Spinner控件:
<Spinner android:id="@+id/sp_cities" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:entries="@array/cities" android:layout_below="@+id/textView1" />
4. SAXXML类中的主要代码如下,有详解注释:
public class SAXXML {public List<City> saxXml() {MyDefaultHandler myHandler = new MyDefaultHandler();// 1.创建解析器工厂对象SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();// 2.使用当前配置的工厂参数创建SAXParser的一个新实例(解析器对象)try {SAXParser saxParser = saxParserFactory.newSAXParser();// 3.解析xml文件saxParser.parse(getClass().getClassLoader().getResourceAsStream("china.xml"),myHandler);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return myHandler.getCities();}// 事件驱动的处理者class MyDefaultHandler extends DefaultHandler {// 当前解析的标签private String tagName = null;//当前解析的对象private City currentCity = null;private List<City> cities;public List<City> getCities() {return cities;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {super.characters(ch, start, length);if (tagName != null) {String value = new String(ch, start, length);if (tagName.equals("cityname")) {currentCity.setCityName(value);}else if (tagName.equals("pyName")) {currentCity.setPyName(value);}else if (tagName.equals("quName")) {currentCity.setQuName(value);}else if (tagName.equals("state1")) {currentCity.setState1(value);}else if (tagName.equals("state2")) {currentCity.setState2(value);}else if (tagName.equals("stateDetailed")) {currentCity.setStateDetailed(value);}else if (tagName.equals("tem1")) {currentCity.setTem1(value);}else if (tagName.equals("tem2")) {currentCity.setTem2(value);}else if (tagName.equals("windState")) {currentCity.setWindState(value);}}}@Overridepublic void endDocument() throws SAXException {super.endDocument();System.out.println("---endDocument()---");}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(uri, localName, qName);if (qName.equals("city")) {cities.add(currentCity);currentCity = null;}this.tagName = null;}// 开始解析文档@Overridepublic void startDocument() throws SAXException {super.startDocument();System.out.println("---startDocument()---");cities = new ArrayList<>();}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);//判断标签是不是city标签if (qName.equals("city")) {//实例化对象currentCity = new City();//判断属性对象是否为空if (attributes != null) {//将属性值添加到city中currentCity.setCityName(attributes.getValue("cityname"));currentCity.setPyName(attributes.getValue("pyName"));currentCity.setQuName(attributes.getValue("quName"));currentCity.setState1(attributes.getValue("state1"));currentCity.setState2(attributes.getValue("state2"));currentCity.setStateDetailed(attributes.getValue("stateDetailed"));currentCity.setTem1(attributes.getValue("tem1"));currentCity.setTem2(attributes.getValue("tem2"));currentCity.setWindState(attributes.getValue("windState"));}}this.tagName = qName;}}}5. MainActivity的主要步骤是:获取控件对象,实现OnItemSelectedListener接口注册监听事件,获取字符串数组,设置控件的默认值,获取解析的xml文件等,主要代码如下:
public class MainActivity extends Activity implements OnItemSelectedListener {private Spinner sp_cities;private TextView tv_fengli;private String cities[];private SAXXML saxXml;private List<City> entities;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取控件对象sp_cities = (Spinner) findViewById(R.id.sp_cities);tv_fengli = (TextView) findViewById(R.id.tv_fengli);// 注册事件sp_cities.setOnItemSelectedListener(this);// 获取字符串数组cities = getResources().getStringArray(R.array.cities);saxXml = new SAXXML();// 设置控件的默认值sp_cities.setSelection(2);// 获取解析的xml文件entities = saxXml.saxXml();}@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position,long id) {for (City c : entities) {// 找到对应的city对象if (c.getQuName().equals(cities[position])) {// 设置风力tv_fengli.setText(c.getWindState());break;}}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {System.out.println("nothing");}}6. 主要功能:
通过点击下拉列表里的城市进行切换,实现各城市风力的显示。
0 0
- 通过Sax方式解析xml文件
- jaxp通过sax方式解析xml文件
- javaIO--通过SAX方式解析xml文件简例
- java--通过sax方式解析xml文件的简单实例
- SAX方式解析XML文件
- xml文件--SAX方式解析xml文件
- 通过SAX方式生成xml文件
- 通过SAX方法解析xml文件
- Android SAX方式解析XML文件
- JAVA SAX 方式解析XML文件
- android XML 文件解析~SAX方式!
- android解析xml文件的SAX方式
- XML文件解析(SAX方式)
- JAVA SAX 方式解析XML文件
- XML文件解析(SAX方式)
- Qt 中sax方式 解析 xml文件
- 【JAXP】SAX方式解析XML文件
- SAX方式解析xml文件查看天气
- Light OJ 1268 Unlucky Strings 矩阵快速幂+KMP
- RestEasy(restful风格的)WebService
- uml 部署图
- vs2012创建空MFC工程
- cocos2d-x-3.1在eclipse中的环境搭建
- 通过Sax方式解析xml文件
- 实施一个Web服务
- 有需要用工程思想开发软件吗?
- Android---PendingIntent
- vs下动态链接库文件的创建以及动态链接库在程序中使用
- SQL中的模式匹配
- 图片处理,如何避免大图片加载的OOM
- The Swift Programming Language系列目录
- Swift 笔记 (四) —— 集合类型