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

yizhihongxing

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日

相关文章

  • ubuntu怎么设置成中文界面 Ubuntu安装中文语言方法详解

    以下是Ubuntu设置成中文界面的完整攻略: 打开“语言支持”:首先,您需要打开Ubuntu的“语言支持”应用程序。您可以在Ubuntu的应用程序列表中找到“语言支持”,或者使用快捷键“Ctrl + Alt + T”打开终端,然后输入“gnome-language-selector”并按下“Enter”键。 添加中文语言:在“语言支持”应用程序中,选择“安装…

    html 2023年5月17日
    00
  • Node.js抓取中文网页乱码问题和解决方法

    Node.js抓取中文网页乱码问题和解决方法 在使用Node.js抓取中文网页时,经常会遇到乱码的问题。下面提供一些解决方法: 1. 设置HTTP头部 在请求中设置HTTP头部来指定编码类型,可以有效避免乱码问题。 示例代码: const https = require(‘https’); const options = { hostname: ‘www.e…

    html 2023年5月31日
    00
  • OpenXml合并Table单元格代码实例

    当我们需要对Word文档进行排版时,Table表格是一个非常重要的排版工具。有时候我们需要合并Table表格中的单元格,以满足各种排版要求。OpenXml提供了一些API,可以方便地合并Table表格中的单元格,本篇文章将详细讲解如何实现OpenXml合并Table单元格。 1.准备工作 在开始使用OpenXml进行Table单元格合并之前,需要了解Open…

    html 2023年5月30日
    00
  • 字符集和字符编码(Charset & Encoding)

    字符集和字符编码 (Charset & Encoding) 在计算机中,字符集是一组可用字符的集合。每个字符都有一个唯一的数字标识,这个数字标识成为字符编码。因此,字符编码是指将字符映射到它们的唯一标识符的过程,这个过程是与特定的字符集相关的。 常见的字符集有 ASCII、ISO-8859、GB2312、GBK、UTF-8 等。不同的字符集支持的字符…

    html 2023年5月31日
    00
  • java中四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    Java中四种生成和解析XML文档的方法详解 XML(可扩展标记语言)是一种用于存储和交换数据的标记语言。在Java中,我们可以使用不同的方式生成和解析XML文档。本文将介绍Java中四种生成和解析XML文档的方法,并对它们的优缺点进行比较。 1. DOM(文档对象模型) DOM是一种将整个XML文档视为一个树形结构的方法。它通过解析整个文档并将其存储在内存…

    html 2023年5月30日
    00
  • excel乱码怎么办 excel乱码修复详细解决方法

    Excel乱码怎么办?Excel乱码修复详细解决方法 Excel表格中出现乱码是一个很常见的问题,主要有以下几种原因: 打开文件时未正确选择编码格式 文件本身存在问题或损坏 电脑操作系统或Excel程序本身存在问题 那么该如何解决Excel乱码问题呢?下面详细介绍Excel乱码修复的具体方法。 方法一:使用正确的编码格式打开Excel文件 首先,我们需要确保…

    html 2023年5月31日
    00
  • ASP.NET XmlDocument类详解

    ASP.NET XmlDocument类详解 一、XmlDocument类概述 XmlDocument是.NET框架中处理XML文档的一个类. 它提供了大量的API用于加载,操作和修改XML文档。 二、XmlDocument类的属性和方法 XmlDocument类具有以下一些常用属性和方法: 1. 加载和创建XML文档 XmlDocument xmlDoc …

    html 2023年5月30日
    00
  • Android Studio怎么解决导入项目的中文注释乱码的问题?

    下面是针对“Android Studio怎么解决导入项目的中文注释乱码的问题”的完整攻略。 确认编码格式为UTF-8 首先要确定代码和注释的编码格式是否为UTF-8,如果不是,则会导致中文注释乱码。具体步骤如下: 打开Android Studio,选择File > Settings > Editor > File Encodings。 将全…

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