Android核心技術-day02-09-生成xml檔案 及 解析
阿新 • • 發佈:2018-11-07
AndroidManifest.xml
方式一:
package com.gaozewen.savexmlinfo; import android.Manifest; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; public class MainActivityOld extends BaseActivity { private EditText mEt_id; private EditText mEt_name; private EditText mEt_age; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. 找到所有需要用到的空間 mEt_id = findViewById(R.id.et_id); mEt_name = findViewById(R.id.et_name); mEt_age = findViewById(R.id.et_age); } // 2. 將控制元件內容寫到 xml 檔案當中 public void save(View view) { // 3. 根據控制元件讀取使用者輸入的文字放入到字串變數中 String id = mEt_id.getText().toString().trim(); String name = mEt_name.getText().toString().trim(); String age = mEt_age.getText().toString().trim(); // 4. 判斷是否有空的內容 if (TextUtils.isEmpty(id) || TextUtils.isEmpty(name) || TextUtils.isEmpty(age)) { Toast.makeText(this,"資訊不能為空", Toast.LENGTH_SHORT).show(); return; } else { // 5. 將字串寫入到 xml 檔案中 final StringBuffer sb = new StringBuffer(); sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"); sb.append("<info>"); sb.append("<student>"); sb.append("<id>"+id+"</id>"); sb.append("<name>"+name+"</name>"); sb.append("<age>"+age+"</age>"); sb.append("</student>"); sb.append("</info>"); // 請求寫入 sd 卡的許可權 performCodeWithPermission("儲存學生資訊到SD卡", new PermissionCallback() { @Override public void hasPermission() { try { File file = new File(Environment.getExternalStorageDirectory(), "info.xml"); FileOutputStream fos = new FileOutputStream(file); fos.write(sb.toString().getBytes()); fos.close(); Toast.makeText(MainActivityOld.this,"儲存學生資訊成功", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivityOld.this,"儲存學生資訊失敗", Toast.LENGTH_SHORT).show(); } } @Override public void noPermission() { Toast.makeText(MainActivityOld.this,"沒有被授予許可權", Toast.LENGTH_SHORT).show(); } }, Manifest.permission.WRITE_EXTERNAL_STORAGE); } } }
方式二:
package com.gaozewen.savexmlinfo; import android.Manifest; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; import android.util.Xml; import android.view.View; import android.widget.EditText; import android.widget.Toast; import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileOutputStream; public class MainActivity extends BaseActivity { private EditText mEt_id; private EditText mEt_name; private EditText mEt_age; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1. 找到所有需要用到的空間 mEt_id = findViewById(R.id.et_id); mEt_name = findViewById(R.id.et_name); mEt_age = findViewById(R.id.et_age); } // 2. 將控制元件內容寫到 xml 檔案當中 public void save(View view) { // 3. 根據控制元件讀取使用者輸入的文字放入到字串變數中 final String id = mEt_id.getText().toString().trim(); final String name = mEt_name.getText().toString().trim(); final String age = mEt_age.getText().toString().trim(); // 4. 判斷是否有空的內容 if (TextUtils.isEmpty(id) || TextUtils.isEmpty(name) || TextUtils.isEmpty(age)) { Toast.makeText(this, "資訊不能為空", Toast.LENGTH_SHORT).show(); } else { // 請求寫入 sd 卡的許可權 performCodeWithPermission("儲存學生資訊到SD卡", new PermissionCallback() { @Override public void hasPermission() { // 1. 建立一個 xml 檔案的序列化器 // 2. 設定檔案的輸出和編碼方式 // 3. 寫 xml 檔案的頭 // 4. 寫 info 節點 // 5. 寫 student 節點 // 6. 寫 屬性 // 7. 寫 name // 8. 寫 age XmlSerializer serializer = Xml.newSerializer(); try { FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "info.xml")); serializer.setOutput(fos, "utf-8"); serializer.startDocument("utf-8",true); serializer.startTag(null,"info"); serializer.startTag(null,"student"); serializer.attribute(null,"id",id); serializer.startTag(null,"name"); serializer.text(name); serializer.endTag(null,"name"); serializer.startTag(null,"age"); serializer.text(age); serializer.endTag(null,"age"); serializer.endTag(null,"student"); serializer.endTag(null,"info"); serializer.endDocument(); fos.close(); Toast.makeText(MainActivity.this,"儲存學生資訊成功", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this,"儲存學生資訊失敗", Toast.LENGTH_SHORT).show(); } } @Override public void noPermission() { Toast.makeText(MainActivity.this, "沒有被授予許可權", Toast.LENGTH_SHORT).show(); } }, Manifest.permission.WRITE_EXTERNAL_STORAGE); } } }
解析:
package com.gaozewen.pulldemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Xml; import android.view.View; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void click(View view) { try { InputStream is = this.getAssets().open("info.xml"); // 解析 info.xml try { // 1. 得到 xml 檔案的解析器 XmlPullParser parser = Xml.newPullParser(); // 2. 得到輸入流 parser.setInput(is, "utf-8"); // 3. 解析 xml 檔案,獲取當前事件型別 int type = parser.getEventType(); while (type != XmlPullParser.END_DOCUMENT) { System.out.println(type + "----" + parser.getName() + "----" + parser.getText()); type = parser.next(); } is.close(); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } }