下面就为您详细讲解“Android中的xml解析介绍”的完整攻略。
什么是XML解析
XML 指可扩展标记语言。 XML 被设计用来传输和存储数据。 XML 是一种非常常用的数据传输格式,也是 Android 开发中常用的一种数据传输格式。Android 中常用的 XML 解析方式有三种:SAX、DOM 和 Pull。
SAX 解析方式
SAX 是 Simple API for XML 的缩写,是一种基于事件驱动的解析方式,SAX 解析 XML 文件时,按顺序解析每个 XML 元素,是一种快速并且最佳的解析方式。但是使用起来比较复杂,需要实现 ContentHandler 接口,并且需要对每个节点进行处理,可以通过继承 DefaultHandler 类来减少代码量。
以下是 SAX 解析方式的示例代码:
public class SaxParseXml extends DefaultHandler {
private List<Book> bookList = null;
private Book book = null;
private String content = null;
public List<Book> getBookList() {
return bookList;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
bookList = new ArrayList<Book>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")) {
book = new Book();
String id = attributes.getValue("id");
book.setId(id);
}
content = "";
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("book")) {
bookList.add(book);
} else if (qName.equals("name")) {
book.setName(content);
} else if (qName.equals("author")) {
book.setAuthor(content);
} else if (qName.equals("year")) {
book.setYear(content);
} else if (qName.equals("price")) {
book.setPrice(content);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
content += new String(ch, start, length);
}
}
DOM 解析方式
DOM 是 Document Object Model 的缩写,是一种建立在内存中表示 XML 文件并进行操作的解析方式。相对于 SAX 解析方式,DOM 解析方式可以在内存中进行修改,不需要修改 XML 文件。但是因为需要将整个 XML 文件都加载到内存中,所以相对比较占用资源。
以下是 DOM 解析方式的示例代码:
public void createXml(Document document, String fileName) throws Exception {
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
File file = new File("/mnt/sdcard/" + fileName);
if (!file.exists()) {
file.createNewFile();
}
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
}
Pull 解析方式
Pull 解析方式是 Android 中自 Android 2.2(API Level 8)开始引入的解析方式。相比较 SAX 解析方式来说,Pull 解析方式对内存资源使用较小,解析速度较快,而且使用起来也比较方便。要使用 Pull 解析方式,需要借助 XmlPullParser 类。
以下是 Pull 解析方式的示例代码:
public static List<Book> readXML(InputStream is) throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
List<Book> bookList = null;
Book book = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
bookList = new ArrayList<Book>();
break;
case XmlPullParser.START_TAG:
if (parser.getName().equalsIgnoreCase("book")) {
book = new Book();
} else if (parser.getName().equalsIgnoreCase("id")) {
String id = parser.nextText();
book.setId(id);
} else if (parser.getName().equalsIgnoreCase("name")) {
String name = parser.nextText();
book.setName(name);
} else if (parser.getName().equalsIgnoreCase("author")) {
String author = parser.nextText();
book.setAuthor(author);
} else if (parser.getName().equalsIgnoreCase("year")) {
String year = parser.nextText();
book.setYear(year);
} else if (parser.getName().equalsIgnoreCase("price")) {
String price = parser.nextText();
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equalsIgnoreCase("book")) {
bookList.add(book);
book = null;
}
break;
}
eventType = parser.next();
}
return bookList;
}
总结
以上就是 Android 中常用的三种 XML 解析方式:SAX、DOM 和 Pull。在开发中我们可以根据具体情况选择相应的方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中的xml解析介绍 - Python技术站