Android之资源文件存取及DOM解析(3)

                   学到这里我们就想到了绝对不能动的R.java文件,对于安卓程序员来说,那是个禁区,是决定不能改动的,那有没有想狮子口拔牙想要把它读出来呢,来我们来试一下。

资源文件的ID都生成在R文件,通过import android.content.res.Resources;将之读出,获取id方法为:

 r=super.getResources();//操作资源

 InputStream input=r.openRawResource(R.raw.mybook);

现在我们自res文件下新建一个raw文件来存出一个资源  mybook.txt,我们实现将之读出,注意定义文本格式选择utf-8,否则读出会是乱码。


Android之资源文件存取及DOM解析(3)
 将布局文件设为utf-8,右键properties

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
   
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
   />

</LinearLayout>

Activity代码:

public class MainActivity extends Activity {

	private TextView text=null;
	private Resources r=null;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.text=(TextView)super.findViewById(R.id.msg);
		r=super.getResources();//操作资源
		InputStream input=r.openRawResource(R.raw.mybook);//读取ID
		Scanner scan=new Scanner(input);
		StringBuffer buf=new StringBuffer();//读取数据
		while(scan.hasNext()){           //循环读取
			buf.append(scan.next()).append("\n");
		}
		scan.close();
		
		try {
			input.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.text.setText(buf.toString());
	}

实现效果为:


Android之资源文件存取及DOM解析(3)
 

  • DOM

使用文件存储固然方便,但是如果数据多了以后,就不太好管理了,现在我们把数据存到xml文件形式进行存储,然后这个格式必须进行解析,解析就要用到DOM解析。

DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。

现在我们实现一个目前我们第一个人机交互保存、

就是用户输入资料,程序保存

并必要时可以读出供用户阅览

定义DOM,也就是布局文件去解析:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/TableLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   
    tools:context=".MainActivity" >

    <TableRow
        android:id="@+id/TableRow01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名" />

        <EditText
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/邮箱"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView" />

        <EditText
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10" >

            <requestFocus />
        </EditText>

    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/but"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="保存" />

    </TableRow>

</TableLayout>

  Activity代码:

public class MainActivity extends Activity {
	private EditText name = null ;
	private EditText email = null ;
	private Button but = null ;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.name = (EditText) super.findViewById(R.id.name) ;
		this.email = (EditText) super.findViewById(R.id.email) ;
		this.but = (Button) super.findViewById(R.id.but) ;
		this.but.setOnClickListener(new OnClickListenerImpl()) ;
	}
	private class OnClickListenerImpl implements OnClickListener{

		@Override
		public void onClick(View v) {
			if (!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED)) {	// 不存在不操作
				return; // 返回到程序的被调用处
			}
			File file = new File(Environment.getExternalStorageDirectory()
					+ File.separator + "eedata" + File.separator
					+ "ee.xml");	// 要输出文件的路径
			if (!file.getParentFile().exists()) { // 父路径不存在
				file.getParentFile().mkdirs() ;	// 创建父文件夹
			}
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
			DocumentBuilder builder = null ;
			try {
				builder = factory.newDocumentBuilder() ;
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
			Document doc = null ;
			doc = builder.newDocument() ;	// 创建一个新的文档
			Element addresslist = doc.createElement("addresslist") ;
			Element linkman = doc.createElement("linkman") ;
			Element name = doc.createElement("name") ;
			Element email = doc.createElement("email") ;
			name.appendChild(doc.createTextNode(MainActivity.this.name.getText()
					.toString()));
			email.appendChild(doc.createTextNode(MainActivity.this.email.getText()
					.toString()));
			linkman.appendChild(name) ;
			linkman.appendChild(email) ;
			addresslist.appendChild(linkman) ;
			doc.appendChild(addresslist) ;
			TransformerFactory tf = TransformerFactory.newInstance() ;
			Transformer t = null ;
			try {
				t = tf.newTransformer() ;
			} catch (TransformerConfigurationException e) {
				e.printStackTrace();
			}
			t.setOutputProperty(OutputKeys.ENCODING, "GBK") ;
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(file) ;
			try {
				t.transform(source, result) ;
			} catch (TransformerException e) {
				e.printStackTrace();
			}
		}
		
	}
}

实现效果如下:


Android之资源文件存取及DOM解析(3)
 
Android之资源文件存取及DOM解析(3)


Android之资源文件存取及DOM解析(3)

接下来我们来读取刚才我们保存的文件:

定义类似的布局文件:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/TableLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TableRow
        android:id="@+id/TableRow01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="邮箱" />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
     />

    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/but"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="读取" />

    </TableRow>

</TableLayout>

 Activity代码:

public class MainActivity extends Activity {
	private TextView name = null;
	private TextView email = null;
	private Button but = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.activity_main);
		this.name = (TextView) super.findViewById(R.id.name);
		this.email = (TextView) super.findViewById(R.id.email);
		this.but = (Button) super.findViewById(R.id.but);
		this.but.setOnClickListener(new OnClickListenerImpl());
	}

	private class OnClickListenerImpl implements OnClickListener {

		@Override
		public void onClick(View v) {
			if (!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED)) { // 不存在不操作
				return; // 返回到程序的被调用处
			}
			File file = new File(Environment.getExternalStorageDirectory()
					+ File.separator + "eedata" + File.separator
					+ "ee.xml"); // 要输出文件的路径
			if (!file.exists()) { // 文件不存在
				return;
			}
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = null;
			try {
				builder = factory.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
			//定义document类对象接口,通过DocumentBuilder进行DOM树转化
			Document doc = null;
			try {
				doc = builder.parse(file); // 通过文件转化文档,读取指定路径的xml文件
			} catch (SAXException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			//查找节点
			NodeList nl = doc.getElementsByTagName("linkman");
			for (int x = 0; x < nl.getLength(); x++) {
				Element e = (Element) nl.item(x); // 取得元素
				MainActivity.this.name.setText(e.getElementsByTagName("name")
						.item(0).getFirstChild().getNodeValue());
				MainActivity.this.email.setText(e.getElementsByTagName("email")
						.item(0).getFirstChild().getNodeValue());
			}
		}

	}
}

 这一章涉及到很多知识,大家需要好好消化

实现效果如图:


Android之资源文件存取及DOM解析(3)


Android之资源文件存取及DOM解析(3)
 
 


 
 

相关推荐