首页 > 代码库 > DOM方式解析xml文件查看天气

DOM方式解析xml文件查看天气

1.步骤:

①创建文档解析器的工厂对象

②得到文档解析器对象

③获取输入流对象

④通过解析器的parse方法解析is对象 转换成Document对象

⑤返回的是文档的根节点

⑥判断是否有孩子节点进行获取子节点转换成元素节点得到属性节点

⑦得到具体的某个属性节点

2.解析元素节点、属性节点、文本节点:

3.界面搭建

界面搭建的相关代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}" >

    <TextView
        android:id="@+id/tv_tq"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/tq_wendu" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tv_tq"
        android:text="@string/tq_fengli" />

    <TextView
        android:id="@+id/tv_wendu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/tv_tq"
        android:gravity="right"
        android:text="@string/wendu_default" />

    <TextView
        android:id="@+id/tv_fengli"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView2"
        android:layout_alignBottom="@+id/textView2"
        android:layout_alignLeft="@+id/tv_wendu"
        android:layout_alignParentRight="true"
        android:gravity="right"
        android:text="@string/fengli_default" />

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:orientation="horizontal"
        android:layout_below="@+id/textView2" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="@string/city1Name" />

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/city2Name" />
        
         <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/city3Name" />
        

    </RadioGroup>

</RelativeLayout>

其中,android:gravity="right"是右对齐
4.调试

 初始化,获取tv_wendu(温度)、tv_fengli(风力)默认值:
  int checkedId = rg.getCheckedRadioButtonId();
  initData(checkedId);

相关代码:

package www.csdn.net.activityg;

import java.util.List;

import www.csdn.domain.City;
import www.csdn.net.xml.DOMXML;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;

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);
		//new DOMXML().domXml();
		//获取rg的控件对象
		rg=(RadioGroup) findViewById(R.id.radioGroup1);
		//注册监听事件
		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();
		
		//初始化tv_wendu、tv_feng默认值
		int checkedId = rg.getCheckedRadioButtonId();
		initData(checkedId);
	}
	
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		System.out.println(checkedId+"========="+R.id.radio0+";"+R.id.radio1);
		initData(checkedId);
	}
	//根据选中的id进行显示不同城市的天气
	private void initData(int checkedId) {
		City city=null;
		switch(checkedId){
		case R.id.radio0:
			for(City c:cities){
				if("北京".equals(c.getQuName())){
					city=c;
				}
			}
			break;
		case R.id.radio1:
			for(City c:cities){
				if("江苏".equals(c.getQuName())){
					city=c;
				}
			}
			break;
		case R.id.radio2:
			for(City c:cities){
				if("湖南".equals(c.getQuName())){
					city=c;
				}
			}
			break;
		}
		if(city!=null){
			tv_wendu.setText(city.getTem1()+"°~"+city.getTem2()+"°");
			tv_fengli.setText(city.getWindState());
		}
	}
}

总结:

DOM解析的时候,首先要把整个文件读取完毕,装载到内存中。然后再进行解析,在解析的过程,你可以直接获取某个节点,进行操作,也可以获取根节点然后进行遍历操作,得到所有的节点内容。

DOM的优势主要表现在:易用性强,使用DOM时,将把所有的XML文档信息都存于内存中,并且遍历简单,支持XPath,增强了易用性。

DOM的缺点主要表现在:效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用。另外效率低还表现在大量的消耗时间,因为使用DOM进行解析时,将为文档的每个elementattributeprocessing-instrUCtioncomment都创建一个对象,这样在DOM机制中所运用的大量对象的创建和销毁无疑会影响其效率。

适用于:解析小型的xml文件