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日

相关文章

  • foxmail收件箱里的邮件显示乱码该怎么办?

    如何解决Foxmail收件箱里的邮件显示乱码问题 在使用Foxmail邮箱的时候,有时候会遇到收件箱里的邮件显示乱码的问题,这可能是因为Foxmail的编码设置有误导致的。下面将详细介绍如何解决Foxmail收件箱里的邮件显示乱码问题。 步骤一:检查Foxmail编码设置 在Foxmail的邮箱设置中,可以检查并修复编码设置。具体步骤如下: 进入Foxmai…

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

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

    html 2023年5月30日
    00
  • 详解在Python程序中解析并修改XML内容的方法

    下面是关于在Python程序中解析并修改XML内容的方法的完整攻略。 什么是XML? XML(eXtensible Markup Language),是一种标记语言,是一种通用工具,用于描述数据的语法结构。XML与HTML类似,可以用来标记内容的结构,不同之处在于XML标记不是预定义的,而是由用户定义的,它可以扩展到任何程度。在数据交换的过程中,XML作为一…

    html 2023年5月30日
    00
  • C#针对xml基本操作及保存配置文件应用实例

    C#针对XML基本操作及保存配置文件应用实例 1. 基本操作 XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它具有自我描述性、可扩展性和平台无关性等特征,被广泛应用于数据存储和数据交换等领域。 在C#中,可以使用XmlDocument类和相关的方法,来进行XML的基本操作,如创建XML文档、读取和修改XML…

    html 2023年5月30日
    00
  • PHP实现动态添加XML中数据的方法

    下面是详细讲解“PHP实现动态添加XML中数据的方法”的完整攻略。 1. 确认XML文件路径 在实现动态添加XML数据之前,您需要先确认XML文件的路径。可以使用相对路径或绝对路径。 例如,假设XML文件名为”data.xml”,保存在网站根目录下的”data”文件夹中,那么相对路径应该是”data/data.xml”,绝对路径应该是”/path/to/da…

    html 2023年5月30日
    00
  • 怎么制作抖音短视频?7步教你搞定抖音短视频剪辑

    以下是“怎么制作抖音短视频?7步教你搞定抖音短视频剪辑”的完整攻略: 怎么制作抖音短视频?7步教你搞定抖音短视频剪辑 抖音是一款非常流行的短视频应用程序,用户可以在抖音上制作自己的短视频并分享给其他用户观看。下面是制作抖音短视频的详细步骤。 步骤1:打开抖音应用程序 用户需要在手机上打开抖音应用程序,并登录自己的账户。 步骤2:选择拍摄模式 用户可以在抖音中…

    html 2023年5月18日
    00
  • C# xmlSerializer简单用法示例

    C#的xmlSerializer是一个强大的工具,用于在C#对象和XML之间序列化和反序列化。它可以将xml格式的数据转换成C#中的对象,也可以将C#中的对象序列化成xml格式的数据。在本文中,我们将介绍xmlSerializer的简单用法,并提供两个基本的示例说明。 示例1 序列化C#对象为XML格式 假设我们有以下C#类: public class Pe…

    html 2023年5月30日
    00
  • 巧妙mybatis避免Where 空条件的尴尬

    针对“巧妙mybatis避免Where 空条件的尴尬”的问题,我将为您提供以下完整攻略。 什么是Where空条件的尴尬? 在使用Mybatis进行条件查询时,如果某一个或多个查询条件传入的值为空,那么在拼接SQL语句时就会出现WHERE后面没有任何条件的情况,这样不仅会对查询性能造成一定的影响,还降低了查询的准确性。 如何巧妙避免Where空条件的尴尬? 为…

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