Android中使用SAX创建XML文件
在Android开发中,XML文件常用于数据存储、配置信息记录等场景。除了常见的DOM解析方式外,SAX(Simple API for XML)也是处理XML的常用技术。很多人知道SAX常用于解析XML,实际上也可以通过SAX的事件驱动机制,结合XmlSerializer来创建符合规范的XML文件,这种方式内存占用更低,更适合处理大体积XML文件的生成场景。
SAX创建XML的核心原理
SAX本身是事件驱动的解析器,但Android提供的XmlSerializer类是基于SAX的流式API,它不需要像DOM那样先把整个XML树加载到内存,而是按照调用顺序逐个写入XML节点,非常适合移动端资源受限的场景。创建XML的流程主要分为三步:初始化序列化器、按层级写入XML节点、输出最终结果。
完整实现步骤
1. 准备需要的权限
如果要将生成的XML文件保存到外部存储,需要在AndroidManifest.xml中添加存储权限:
<!-- 用于Android 10及以下版本的外部存储读写权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 11及以上需要添加管理外部存储的权限 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2. 实现XML创建的核心代码
下面的示例会创建一个包含学生信息的XML文件,根节点为<students>,下面包含多个<student>子节点,每个子节点有id、name、age三个属性。
import android.os.Environment;
import android.util.Xml;
import org.xmlpull.v1.XmlSerializer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SAXCreateXmlUtil {
// 学生数据类,用于封装要写入XML的数据
static class Student {
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
/**
* 使用SAX相关的XmlSerializer创建XML文件
* @return 创建成功返回true,否则返回false
*/
public static boolean createStudentXml() {
// 1. 准备要写入的数据
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "张三", 18));
studentList.add(new Student(2, "李四", 19));
studentList.add(new Student(3, "王五", 20));
// 2. 检查外部存储是否可用
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return false;
}
// 3. 定义文件保存路径,这里保存到外部存储的Download目录
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File xmlFile = new File(downloadDir, "students.xml");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(xmlFile);
// 4. 初始化XmlSerializer实例,它是基于SAX的XML序列化工具
XmlSerializer serializer = Xml.newSerializer();
// 设置输出流和编码格式
serializer.setOutput(fos, "UTF-8");
// 5. 开始写入XML内容
// 写入XML声明, standalone表示是否独立,true表示没有外部DTD
serializer.startDocument("UTF-8", true);
// 写入根节点students
serializer.startTag(null, "students");
// 循环写入每个学生的信息
for (Student student : studentList) {
// 写入student子节点
serializer.startTag(null, "student");
// 写入id属性
serializer.attribute(null, "id", String.valueOf(student.getId()));
// 写入name子节点
serializer.startTag(null, "name");
serializer.text(student.getName());
serializer.endTag(null, "name");
// 写入age子节点
serializer.startTag(null, "age");
serializer.text(String.valueOf(student.getAge()));
serializer.endTag(null, "age");
// 结束student节点
serializer.endTag(null, "student");
}
// 结束根节点
serializer.endTag(null, "students");
// 结束文档
serializer.endDocument();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
// 关闭输出流,释放资源
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}3. 调用方法并验证结果
在Activity中调用上面的工具方法,注意高版本Android需要动态申请存储权限:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_STORAGE_PERMISSION = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查存储权限,没有则动态申请
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_STORAGE_PERMISSION);
} else {
// 已有存储权限,直接创建XML
createXmlFile();
}
}
private void createXmlFile() {
boolean result = SAXCreateXmlUtil.createStudentXml();
if (result) {
Toast.makeText(this, "XML文件创建成功,路径:/Download/students.xml", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "XML文件创建失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_STORAGE_PERMISSION) {
boolean allGranted = true;
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
allGranted = false;
break;
}
}
if (allGranted) {
createXmlFile();
} else {
Toast.makeText(this, "需要存储权限才能创建XML文件", Toast.LENGTH_SHORT).show();
}
}
}
}生成结果说明
上述代码执行成功后,会在设备的Download目录下生成students.xml文件,内容如下:
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<students>
<student id="1">
<name>张三</name>
<age>18</age>
</student>
<student id="2">
<name>李四</name>
<age>19</age>
</student>
<student id="3">
<name>王五</name>
<age>20</age>
</student>
</students>注意事项
- 使用
XmlSerializer时,每个startTag必须对应一个endTag,否则会导致XML格式错误。 - 节点文本内容需要使用
text方法写入,不要直接拼接在标签里。 - 如果生成的XML需要被其他系统解析,建议设置
standalone为true,避免引入不必要的外部依赖声明。 - Android 10及以上版本对外部存储访问做了限制,如果需要访问自定义路径,建议使用作用域存储或者申请
MANAGE_EXTERNAL_STORAGE权限。
Android_SAXXmlSerializerXML文件生成Android开发数据存储 本作品最后修改时间:2026-05-22 21:21:49