新建assets资源文件夹,右键app --> new --> Folder --> Assets Folder,将info.xml放入此文件夹下面。

info.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<info>
<student id="10011">
<name>lisi</name>
<age>19</age>
</student>
</info>

解析:

MainActivity.java

package com.example.aimee.getfileinfo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View view) {
try {
//1.找到此资产文件并打开
InputStream is = this.getAssets().open("info.xml");//ctrl+shift+方向键可以上下移动
//2.得到xml文件解析器
XmlPullParser parser = Xml.newPullParser();
//3.设置输入流和编码
parser.setInput(is,"utf-8");
//4.解析xml文件,获取当前的事件类型
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT){
Log.i(TAG,parser.getEventType() + "----" + parser.getName() + "----" + parser.getText());
type = parser.next();
} is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

保存:

MainActivity.java

package com.example.aimee.getfileinfo;

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;
import java.io.IOException; public class MainActivity extends com.example.aimee.getfileinfo.BaseActivity { private EditText mEtAge;
private EditText mEtName;
private EditText mEtId; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //1.找到所有需要用到的文件
mEtName = findViewById(R.id.et_name);
mEtAge = (EditText) findViewById(R.id.et_age);
mEtId = (EditText) findViewById(R.id.et_id); //2.将控件内容写到xml文件中
} /**
* 将控件内容写到xml文件中
* @param view
*/
public void save(View view) {
//3.根据控件读取用户输入的文本放入到字符串变量中
final String name = mEtName.getText().toString().trim();
final String age = mEtAge.getText().toString().trim();
final String id = mEtId.getText().toString().trim(); //4.判断是否有空的内容
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(age)){
Toast.makeText(this,"信息不能为空",Toast.LENGTH_SHORT).show();
return;
}else {
//5.将字符串写入到xml文件中
performCodeWithPermission("保存学生信息到sd卡", new PermissionCallback() {
@Override
public void hasPermission() {
//1.创建一个xml文件的序列号器
XmlSerializer serializer = Xml.newSerializer();
//2.设置文件的输出和编码方式
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "info.xml"));
serializer.setOutput(fos,"utf-8");
//3.写入xml文件的头
serializer.startDocument("utf-8",true);
//4.写info节点
serializer.startTag(null,"info");
//5.写student节点
serializer.startTag(null,"student");
//6.写属性
serializer.attribute(null,"id",id);
//7.写name
serializer.startTag(null,"name");
serializer.text(name);
serializer.endTag(null,"name");
//8.写age
serializer.startTag(null,"age");
serializer.text(age);
serializer.endTag(null,"age"); serializer.endTag(null,"student");
serializer.endTag(null,"info");
serializer.endDocument();;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (fos !=null)
fos.close();
Toast.makeText(MainActivity.this,"成功保存文件",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
} @Override
public void noPermission() {
Toast.makeText(MainActivity.this,"没有运行时权限",Toast.LENGTH_SHORT).show();
}
}, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <EditText
android:id="@+id/et_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="60dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="请输入学生的姓名"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> <EditText
android:id="@+id/et_age"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="60dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="请输入学生的年龄"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_name" /> <EditText
android:id="@+id/et_id"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="60dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="请输入学生的学号"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_age" /> <Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="9dp"
android:layout_marginTop="60dp"
android:layout_marginEnd="8dp"
android:text="保存"
android:onClick="save"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/et_id" />
</android.support.constraint.ConstraintLayout>

注意:不要忘了在清单文件中添加权限。

第四十六篇--解析和保存xml文件的更多相关文章

  1. Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)

    一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...

  2. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  3. 第四十六篇、UICollectionView广告轮播控件

    这是利用人的视觉错觉来实现无限轮播,UICollectionView 有很好的重用机制,这只是部分核心代码,后期还要继续完善和代码重构. #import <UIKit/UIKit.h> # ...

  4. C++第四十六篇 -- C++将int转换成宽字符串

    int rate = 60; int score = 80 TCHAR Temp[64] = TEXT(""); _stprintf_s(Temp, TEXT("pass ...

  5. 第四十六篇:工程化概念以及什么是webpack

    好家伙,这波是概念补充 1.什么是工程化概念? 我的开发: 开个项目,想怎么改怎么改,拉个东西过来就用 实际的前端开发: (1) 模块化(js的模块化,css的模块化,资源的模块化) (2) 组件化( ...

  6. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  7. 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)

    解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...

  8. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  9. NeHe OpenGL教程 第四十六课:全屏反走样

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. SpringBoot 动态更新 resources 目录的文件

    一.前言  SpringBoot 打成 Jar 包形式运行后 ,resources 目录下文件的读取修改和原来不太一样,网上比较多的是关于读取的方式,修改的几乎没有,终于在 stackoverflow ...

  2. Spring 中 IoC 容器简介

    IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架 在一个系统中可以生成各种对象,并且这些对象都需要进行管理.为了描述这些对象关系,我们需要一个容 ...

  3. 如何简单的构建Android?

    原文链接:https://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/   过去的几个月中,在Tuenti上与同行例 ...

  4. 突破瓶颈,再出发 - PM过程能力成熟度5级

    尽管程度不同,但PM的每个级别都在践行过程改进,并在4级借助数据,达到了“登峰造极”的程度.随着量化与统计分析的深入,项目会被优化到极其稳定的状态,组织的过程改进也就此进入了平台期. 平台期可以被视为 ...

  5. 为了约会,PM的领导能力篇来啦!

    之前我们花了很大力气阐述PM的过程能力成熟度,为的是让PM把项目管理得心应手,早点下班.可再完美的过程也要人来做啊!兄弟们要是不爽了,你还有心思约会么?那怎么才能管好组里的兄弟,让他们好好执行过程,早 ...

  6. 开始食用grpc(之二)

    开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...

  7. ORM(二)常用字段小记

    常用字段类型: AutoField:字段自增,多用于ID主键字段,每个表中只能有一个AutoField字段类型. id = models.AutoField(primary_key=True) # 设 ...

  8. uboot的启动过程-FDT

    uboot的启动过程,省略了汇编部分之后,第一个执行函数是board_init_f(),在uboot/common目录的board_f.c中   board_init_f函数,首先初始化了全局数据 # ...

  9. Linux(CentOS7)下如何配置多个JDK环境变量

    一.Linux版本 二.复制粘贴多个JDK出来,如下 cp -R jdk1.7.0_80/ jdk1.7.0_80-2 cp -R jdk1.7.0_80/ jdk1.7.0_80-3 三.配置多个J ...

  10. Java获取Linux和Window系统CPU、内存和磁盘总使用率的情况

    这是一个工具类,获取的内容: CPU使用率:得到的是当前CPU的使用情况,这是算出的是两次500毫秒时间差的CPU使用率 内存使用率:[1 -  剩余的物理内存/(总的物理内存+虚拟内存) ] * 1 ...