android编程之xml文件读取和写入方法

Android编程之XML文件读取和写入方法

XML是一种常用的数据交换格式,Android中也广泛使用XML文件来存储数据和配置信息。本文将详细介绍在Android中如何读取和写入XML文件。

1. 读取XML文件

在Android中读取XML文件可以使用Java中的DOM和SAX解析器,其中DOM解析器可以将XML文件解析为树形结构,便于数据获取和修改;而SAX解析器则逐行读取和解析XML文件,更适用于大型XML文件的解析。

1.1 使用DOM解析器读取XML文件

首先需要在Android项目中引入xmlpull和dom4j库,然后可以使用如下代码读取XML文件:

public static void readXmlByDom(File file) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    try {
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(file);
        NodeList nodeList = document.getElementsByTagName("book");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                String title = element.getElementsByTagName("title").item(0).getTextContent();
                String author = element.getElementsByTagName("author").item(0).getTextContent();
                int price = Integer.parseInt(
                        element.getElementsByTagName("price").item(0).getTextContent());
                Log.d("MainActivity", "title: " + title + " author: " + author + " price: " + price);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

在上述示例中,我们首先利用DocumentBuilderFactory类获取DocumentBuilder对象,然后再通过DocumentBuilder的parse方法将XML文件解析为一个Document对象,之后通过getElementsByTagName方法获取到所有名为“book”的节点,并依次遍历每个节点获取其中的title、author和price元素。

1.2 使用SAX解析器读取XML文件

使用SAX解析器读取XML文件需要自定义一个SAXHandler来处理解析过程。下面是一个读取books.xml文件并输出所有book元素的title、author和price的示例:

public static void readXmlBySax(File file) {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    try {
        SAXParser parser = factory.newSAXParser();
        XMLReader reader = parser.getXMLReader();
        reader.setContentHandler(new SAXHandler());
        reader.parse(new InputSource(new FileInputStream(file)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static class SAXHandler extends DefaultHandler {
    private StringBuilder sb = new StringBuilder();
    private String title;
    private String author;
    private int price;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equals("book")) {
            title = "";
            author = "";
            price = 0;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (qName.equals("title")) {
            title = sb.toString().trim();
        } else if (qName.equals("author")) {
            author = sb.toString().trim();
        } else if (qName.equals("price")) {
            price = Integer.parseInt(sb.toString().trim());
        } else if (qName.equals("book")) {
            Log.d("MainActivity", "title: " + title + " author: " + author + " price: " + price);
        }
        sb.setLength(0);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        sb.append(ch, start, length);
    }
}

该示例中我们首先通过SAXParserFactory获取SAXParser对象,然后获取XMLReader实例,接着设置解析过程需要用到的ContentHandler(这里我们自定义了一个SAXHandler类),最后调用reader的parse方法并传入待解析的XML文件作为参数。在SAXHandler中我们可以通过startElement、endElement和characters方法实现对XML文件的逐行读取和处理,最终输出所有book元素的title、author和price。

2. 写入XML文件

在Android中写入XML文件同样可以使用DOM和SAX解析器,以下将详细介绍如何使用DOM解析器向XML文件写入数据。

2.1 向XML文件中添加节点

以下示例演示如何向books.xml文件中添加一个新的book元素:

public static void addBook(File file, String title, String author, int price) {
  try {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(file);

      Element root = document.getDocumentElement();
      Element bookElement = document.createElement("book");
      Element titleElement = document.createElement("title");
      titleElement.setTextContent(title);
      Element authorElement = document.createElement("author");
      authorElement.setTextContent(author);
      Element priceElement = document.createElement("price");
      priceElement.setTextContent(String.valueOf(price));
      bookElement.appendChild(titleElement);
      bookElement.appendChild(authorElement);
      bookElement.appendChild(priceElement);
      root.appendChild(bookElement);

      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
      DOMSource source = new DOMSource(document);
      StreamResult result = new StreamResult(new FileOutputStream(file));
      transformer.transform(source, result);
  } catch (Exception e) {
      e.printStackTrace();
  }
}

在上述示例中,我们首先使用DocumentBuilder的parse方法将books.xml文件解析成一个Document对象,然后通过document的getDocumentElement方法获取根节点(即books元素),随后使用createElement方法依次创建title、author、price和book节点,并将它们插入到根节点的末尾。最后我们使用Transformer将更新后的Document对象输出到文件中。

2.2 修改XML文件中的节点

以下示例演示如何修改books.xml文件中的一个book元素的price值:

public static void updateBook(File file, String title, int newPrice) {
  try {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(file);

      NodeList nodeList = document.getElementsByTagName("book");
      for (int i = 0; i < nodeList.getLength(); i++) {
          Element element = (Element) nodeList.item(i);
          if (element.getElementsByTagName("title").item(0).getTextContent().equals(title)) {
              element.getElementsByTagName("price").item(0).setTextContent(String.valueOf(newPrice));
          }
      }

      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
      DOMSource source = new DOMSource(document);
      StreamResult result = new StreamResult(new FileOutputStream(file));
      transformer.transform(source, result);
  } catch (Exception e) {
      e.printStackTrace();
  }
}

在上述示例中,我们依然使用DocumentBuilder的parse方法将books.xml文件解析成一个Document对象,之后通过getElementsByTagName方法获取所有名为“book”的节点,并依次遍历每个节点判断其title元素的值是否与指定title相等,如果相等,则修改该节点的price元素值,并使用Transformer将更新后的Document对象输出到文件中。

示例1

假如要读取一个名为books.xml的XML文件,该文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books>
    <book>
        <title>Android编程权威指南</title>
        <author>Bill Phillips</author>
        <price>69</price>
    </book>
    <book>
        <title>第一行代码</title>
        <author>郭霖</author>
        <price>49</price>
    </book>
</books>

可以使用以下代码读取文件并输出所有book元素的title、author和price:

File file = new File(getFilesDir(), "books.xml");
XmlUtils.readXmlByDom(file);
XmlUtils.readXmlBySax(file);

示例2

假如我们要向books.xml文件中添加一本新书,其title为“Android开发艺术探索”、author为“任玉刚”、price为“89”元,则可以使用以下代码实现:

File file = new File(getFilesDir(), "books.xml");
XmlUtils.addBook(file, "Android开发艺术探索", "任玉刚", 89);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android编程之xml文件读取和写入方法 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • python解析xml模块封装代码

    下面我将为你详细讲解“Python解析XML模块封装代码”的完整攻略。 1. 什么是XML? XML全称Extensible Markup Language,即可扩展标记语言。XML是一种用于存储和传输数据的标记语言,常被作为各种数据格式的基础,如HTML、RSS、Atom等。 2. Python中解析XML的模块 Python提供了多种方式来解析XML,并…

    html 2023年5月30日
    00
  • ai没保存怎么找回? ai未保存文件的两种找回方法

    当AI未保存文件时,我们可以尝试以下两种方法来找回文件: 方法1:使用恢复功能 打开AI软件,点击“文件”菜单,选择“恢复”。 在弹出的窗口中,选择未保存的文件,点击“恢复”。 如果恢复成功,将会提示您保存文件。 保存文件后,即可找回未保存的文件。 方法2:查找临时文件 打开文件管理器,进入系统盘符(通常为C盘)。 在搜索框中输入“*.tmp”(不含引号),…

    html 2023年5月17日
    00
  • perl 基本语法介绍

    Perl 基本语法介绍 变量和数据类型 Perl的变量无需提前声明,直接赋值即可创建变量。Perl有三种变量类型:$_、@_、%_,分别对应标量、数组、散列。 标量包括整数、浮点数、字符串,Perl不需要指定数据类型,自动识别。用 $ 符号表示标量。 数组用 @ 符号表示,散列用 % 符号表示。 示例1: $x = 123; $y = "hello…

    html 2023年5月30日
    00
  • 基于Intellij Idea乱码的解决方法

    下面详细讲解基于Intellij Idea乱码的解决方法: 问题描述 在使用Intellij Idea进行开发时,如果文件编码格式与当前项目的编码格式不一致,就会出现乱码问题。例如,当前项目使用UTF-8编码,但是某个文件使用了GBK编码,导致该文件打开后显示成了乱码。 解决方法 方法一:设置全局编码 可以在Intellij Idea的设置中设置全局的编码格…

    html 2023年5月31日
    00
  • MyBatis Xml映射文件之字符串替换方式

    MyBatis是Java中一款优秀的ORM框架,可以很方便地帮助开发者完成对数据库的操作,而MyBatis Xml映射文件则是这个框架很重要的一个部分。在编写MyBatis映射文件时,有时候需要进行一些字符串替换的操作,比如给SQL语句加上表前缀等。本文将详细讲解MyBatis Xml映射文件中的字符串替换方式,包括使用${}和使用#{}两种方式。 使用${…

    html 2023年5月30日
    00
  • Win10重置后不能更新怎么办 Win10更新提示0x8024402f错误的解决方法

    如果您在Win10重置后不能更新,或者在更新时遇到0x8024402f错误提示,可以按照以下步骤进行操作: 步骤1:检查网络连接 确保您的电脑已连接到可用的网络。 检查您的网络连接是否正常。 确保您的网络连接没有被防火墙或其他安全软件阻止。 步骤2:清除更新缓存 按下Win+R键,打开运行窗口。 输入“services.msc”,并按下回车键。 在“服务”窗…

    html 2023年5月17日
    00
  • Session过期后自动跳转到登录页面的实例代码

    关于“Session过期后自动跳转到登录页面的实例代码”的实现,您可以按照以下步骤进行: 在程序顶部,引入所需的依赖库: from flask import session, request, redirect, url_for 获取session中用户的登录状态,判断是否已过期: @app.before_request def before_request…

    html 2023年5月31日
    00
  • asp在服务器把 XML 转换为 XHTML的实现代码

    ASP(Active Server Pages)是一种服务器端脚本语言,可以用来处理服务器端的逻辑操作、生成动态网页等。在ASP中,可以通过内置的XML DOM对象,对XML数据进行解析和处理。一般情况下,在ASP中通过XML DOM对象读取XML数据,并在服务器端把其转换为XHTML格式,最终在客户端显示出来。 下面是ASP在服务器把XML转换为XHTML…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部