Android中使用DOM方式创建XML文件
在Android开发中,我们经常会遇到需要生成XML格式数据的场景,比如保存本地配置、向服务端传输结构化数据等。DOM(Document Object Model,文档对象模型)是一种常用的XML处理方式,它把整个XML文档加载到内存中,以树形结构来组织节点,开发者可以通过操作节点来构建完整的XML文档。下面我们就详细介绍如何在Android中使用DOM方式创建XML文件。
DOM创建XML的核心步骤
使用DOM方式创建XML文件,整体可以分为以下几个核心步骤:
- 获取DocumentBuilderFactory实例,用于创建DocumentBuilder
- 通过DocumentBuilder创建空白的Document文档对象
- 按照XML结构逐层创建元素节点、设置节点文本内容和属性
- 将构建好的Document文档通过Transformer转换为XML格式输出到文件或流中
完整代码示例
下面的代码演示了在Android中创建一个包含学生信息的XML文件,文件根节点为<students>,包含多个<student>子节点,每个子节点有id属性和name、age、score三个子元素。
import android.content.Context;
import android.os.Environment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class XmlCreator {
/**
* 使用DOM方式创建学生信息XML文件
* @param context 上下文,用于获取存储目录
* @return 创建成功的文件对象,失败返回null
*/
public static File createStudentXml(Context context) {
try {
// 1. 获取DocumentBuilderFactory实例
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2. 通过factory创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 3. 创建空白Document文档
Document document = builder.newDocument();
// 设置文档 standalone 属性,非必须,根据实际需求设置
document.setXmlStandalone(true);
// 4. 创建根节点 <students>
Element rootElement = document.createElement("students");
document.appendChild(rootElement);
// 创建第一个学生节点 <student id="1">
Element student1 = document.createElement("student");
// 设置student节点的id属性
student1.setAttribute("id", "1");
// 创建name子节点
Element name1 = document.createElement("name");
Text name1Text = document.createTextNode("张三");
name1.appendChild(name1Text);
student1.appendChild(name1);
// 创建age子节点
Element age1 = document.createElement("age");
Text age1Text = document.createTextNode("18");
age1.appendChild(age1Text);
student1.appendChild(age1);
// 创建score子节点
Element score1 = document.createElement("score");
Text score1Text = document.createTextNode("95");
score1.appendChild(score1Text);
student1.appendChild(score1);
// 将第一个学生节点添加到根节点
rootElement.appendChild(student1);
// 创建第二个学生节点 <student id="2">
Element student2 = document.createElement("student");
student2.setAttribute("id", "2");
Element name2 = document.createElement("name");
Text name2Text = document.createTextNode("李四");
name2.appendChild(name2Text);
student2.appendChild(name2);
Element age2 = document.createElement("age");
Text age2Text = document.createTextNode("19");
age2.appendChild(age2Text);
student2.appendChild(age2);
Element score2 = document.createElement("score");
Text score2Text = document.createTextNode("88");
score2.appendChild(score2Text);
student2.appendChild(score2);
rootElement.appendChild(student2);
// 5. 将Document转换为XML并输出到文件
// 获取输出文件目录,这里使用外部存储的应用私有目录,避免权限问题
File outDir;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
outDir = context.getExternalFilesDir(null);
} else {
outDir = context.getFilesDir();
}
if (outDir == null) {
return null;
}
File outFile = new File(outDir, "students.xml");
// 获取TransformerFactory实例
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// 设置输出属性,缩进格式,方便阅读
transformer.setOutputProperty("encoding", "UTF-8");
transformer.setOutputProperty("indent", "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
// 绑定源文档和输出流
DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(outFile);
// 执行转换,输出XML文件
transformer.transform(domSource, streamResult);
return outFile;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}代码说明
上述代码首先通过DocumentBuilderFactory和DocumentBuilder创建了空白的XML文档对象,这是DOM处理的基础。接着从根节点开始,逐层创建元素节点:先创建<students>根节点,再为每个学生的信息创建<student>节点,给<student>节点设置id属性,然后依次为每个<student>节点添加<name>、<age>、<score>子节点,并通过createTextNode方法设置子节点的文本内容。
节点构建完成后,使用Transformer类将内存中的Document对象转换为实际的XML格式,输出到指定的文件中。这里需要注意输出文件的存储目录选择:优先使用外部存储的应用私有目录,既不需要额外申请存储权限,也能保证文件仅在应用内可访问,避免数据泄露。同时我们设置了输出编码为UTF-8,并且开启了缩进格式,生成的XML文件可读性更好。
注意事项
- DOM方式会把整个XML文档加载到内存中,如果生成的XML数据量非常大,可能会导致内存占用过高,这种情况建议换成其他方式如XmlSerializer处理。
- 如果需要在Android 6.0及以上版本使用外部存储的公共目录,需要动态申请
WRITE_EXTERNAL_STORAGE权限,上述代码使用的是应用私有目录,无需额外权限。 - 所有的节点创建、属性设置都需要基于同一个Document对象,不要跨Document操作节点,否则会抛出异常。
AndroidDOM解析XML创建DocumentBuilderXmlSerializer 本作品最后修改时间:2026-05-22 21:19:08