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技术站