导读:本期聚焦于小伙伴创作的《Android如何使用DOM方式创建XML文件?完整代码示例与步骤解析》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Android如何使用DOM方式创建XML文件?完整代码示例与步骤解析》有用,将其分享出去将是对创作者最好的鼓励。

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

代码说明

上述代码首先通过DocumentBuilderFactoryDocumentBuilder创建了空白的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

免责声明:网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。