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日

相关文章

  • 麒麟985怎么样 麒麟985详细评测

    以下是“麒麟985怎么样 麒麟985详细评测”的完整攻略: 麒麟985怎么样? 麒麟985是华为公司推出的一款高端移动处理器,采用7nm工艺制造,拥有强大的性能和低功耗特性。该处理器被广泛应用于华为的高端手机产品中,如华为Mate 30系列、华为P40系列等。下面是一些关于麒麟985的评测和技巧,可以帮助用户更好地了解该处理器。 评测1:强大的性能 麒麟98…

    html 2023年5月18日
    00
  • flex程序Firefox下中文输入乱码的bug

    下面是针对“flex程序Firefox下中文输入乱码的bug”的完整攻略: 问题描述 在使用flex程序编写Firefox浏览器插件中,当触发中文输入时,Firefox浏览器会出现乱码的情况(英文字符正常显示)。这个问题通常发生在Windows操作系统下,Mac OS和Linux操作系统似乎不会出现。 解决方案 该问题的解决思路是使用合适的编码方式来处理中文…

    html 2023年5月31日
    00
  • html5设计原理(推荐收藏)

    HTML5设计原理 HTML5是当前Web开发中最重要的技术之一,它为网页设计师和开发者提供了更多的选择。HTML5的设计原理是什么?如何使用HTML5来优化网页的设计?本文将详细讲解HTML5的设计原理,帮助读者加深了解。 什么是HTML5 HTML5是一种用于构建Web页面和应用程序的最新技术。它不仅提供新的语义元素,而且还包含了与旧版本HTML相比更多…

    html 2023年5月30日
    00
  • Linux系统下加载U盘设备时文件乱码的有效解决方法

    当在Linux系统中使用U盘设备的时候,有可能会遇到文件名乱码的问题。这是因为不同的文件系统使用的字符集不同,而操作系统并不一定会自动识别使用的字符集。在这种情况下,我们可以采取以下方法解决乱码问题: 第一步:查看文件系统 首先需要确认使用的U盘设备的文件系统类型。我们可以使用以下命令查看: sudo fdisk -l 这将列出系统中所有的磁盘和分区信息,找…

    html 2023年5月31日
    00
  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    下面是一份详细讲解“Android编程解析XML文件的方法详解【基于XmlPullParser】”的攻略。 标题 Android编程解析XML文件的方法详解【基于XmlPullParser】 简介 在Android开发中,我们经常需要解析XML文件,比如解析网络数据、解析配置文件等。Android提供了多种解析XML的方式,其中最常用的是基于XmlPullP…

    html 2023年5月30日
    00
  • C#实现XML文件操作详解

    C#实现XML文件操作详解 什么是XML文件 XML(eXtensible Markup Language)是一种标记语言, 它不是一种编程语言,而是一种类似于 HTML 、CSS 的定义性标记语言。XML 文件包含了标签、属性、文本和注释等元素。 与 HTML 不同的是,XML 是一种通用的数据编码语言,它可以在网络上交换数据,具有跨平台、跨语言和扩展性等…

    html 2023年5月30日
    00
  • 处理及遍历XML文档DOM元素属性及方法整理

    处理及遍历XML文档DOM元素属性及方法整理 在操作XML文档时,我们可以使用DOM(文档对象模型)来访问XML文档的各个元素和属性。下面将简要介绍DOM的相关方法及属性,帮助你更好地处理及遍历XML文档。 DOM基础概念 DOM将XML文档表示为树形结构,其中XML文档中每个元素都是DOM中的一个节点。根据节点间的关系,可以将DOM分为以下几个节点类型: …

    html 2023年5月30日
    00
  • Springboot Thymeleaf实现HTML属性设置

    下面是SpringBoot Thymeleaf实现HTML属性设置的完整攻略。 一、概述 在Web应用程序中,HTML属性是非常重要的元素。SpringBoot框架自带的模板引擎——Thymeleaf——可以方便地生成HTML内容。在本篇文章中,我们将会学习如何在HTML标签中设置属性,并展示两个示例来说明如何在SpringBoot Thymeleaf中实现…

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