首页 > 代码库 > 通过Sax方式解析xml文件
通过Sax方式解析xml文件
说明:此案例使用的是通过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 block
e.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;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if (tagName != null) {
String value = http://www.mamicode.com/new String(ch, start, length);>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; @Override protected 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(); } @Override public 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; } } } @Override public void onNothingSelected(AdapterView<?> parent) { System.out.println("nothing"); } }6. 主要功能:
通过点击下拉列表里的城市进行切换,实现各城市风力的显示。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。