当前位置: 代码迷 >> Android >> Android之资源文件存取及DOM解析(三)
  详细解决方案

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

热度:76   发布时间:2016-04-28 01:25:46.0
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,否则读出会是乱码。



?将布局文件设为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());	}

?

实现效果为:



?

  • 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();			}		}			}}

?

实现效果如下:



?


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

定义类似的布局文件:

<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());			}		}	}}

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

实现效果如图:




?
?


?
?

?

  相关解决方案