首页 > 代码库 > 通过Dom方式解析xml文件
通过Dom方式解析xml文件
此项目通过简单的天气情况显示来实现xml文件的解析
1. 搭建环境
1)创建如下图的包、类及文件
2)布局文件的大概样式如下图所示,用到四个TextView控件和一个RadioGroup控件
3)china.xml文件的内容如下
<?xml version="1.0" encoding="UTF-8"?> <china dn="day"> <city cityname="南京" pyName="jiangsu" quName="江苏" state1="1" state2="1" stateDetailed="多云" tem1="24" tem2="19" windState="西北风3-4级" /> <city cityname="北京" pyName="beijing" quName="北京" state1="1" state2="1" stateDetailed="多云" tem1="26" tem2="15" windState="西北风5-6级" /> </china>
4)City类中主要就是按照china.xml文件中<city>标签内的属性声明变量,并实现无参和有参构造器,以及各自的get和set方法,有需要的话可以实现toString方法。
2. DOMXML的主要代码如下,可通过注释加强理解:
public class DOMXML { public List<City> domXml() { // 创建返回的集合对象 List<City> cities = new ArrayList<City>(); // 创建文档解析器的工厂对象 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); try { // 得到文档解析器对象 DocumentBuilder builder = builderFactory.newDocumentBuilder(); // 获取输入流对象 InputStream is = getClass().getClassLoader().getResourceAsStream( "china.xml"); // 通过解析器的parse方法解析流对象,转化成文档对象 Document document = builder.parse(is); // 返回的是文档的根节点 Element rootElement = document.getDocumentElement(); // 获取指定属性的属性值 // String value = http://www.mamicode.com/rootElement.getAttribute("dn");>3. MainActivity的主要步骤是:获取控件对象,实现OnCheckedChangeListener接口,注册监听事件,解析xml文件对象的实例化,并显示缺省值以及默认值等,主要代码如下:
public class MainActivity extends Activity implements OnCheckedChangeListener { private RadioGroup rg; private TextView tv_wendu, tv_fengli; private DOMXML domxml; private List<City> cities; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rg = (RadioGroup) findViewById(R.id.rg); // 注册监听事件 rg.setOnCheckedChangeListener(this); tv_wendu = (TextView) findViewById(R.id.tv_wendu); tv_fengli = (TextView) findViewById(R.id.tv_fengli); // 解析xml文件对象的实例化 domxml = new DOMXML(); // 调用相应的方法 cities = domxml.domXml(); //如何显示缺省值 int checkedId = rg.getCheckedRadioButtonId(); initData(checkedId); } // checkedId就是被选中的id值 @Override public void onCheckedChanged(RadioGroup group, int checkedId) { initData(checkedId); } //根据选中的id显示不同城市的天气 private void initData(int checkedId) { City city = null; switch (checkedId) { case R.id.radio0: for (City c : cities) { if ("北京".equals(c.getCityName())) { city = c; } } break; case R.id.radio1: for (City c : cities) { if ("南京".equals(c.getCityName())) { city = c; } } break; } if (city != null) { tv_wendu.setText(city.getTem2() + "°~" + city.getTem1() + "°"); tv_fengli.setText(city.getWindState()); } } }
4. 主要功能:通过点击北京/南京的按钮进行切换,温度和风力随之改变。
5. 备注:
在判断子节点的类型之后,可以不创建实体对象,在转换成元素节点后直接添加到集合中:
Element element = (Element) node; // 把转换的city对象添加到集合中 cities.add(new City(element.getAttribute("cityname"), element.getAttribute("pyName"), element.getAttribute("quName"), element.getAttribute("state1"), element.getAttribute("state2"), element.getAttribute("stateDetailed"), element.getAttribute("tem1"), element.getAttribute("tem2"), element.getAttribute("windState")));
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。