Android XML数据的三种解析方式
XML简介
XML(Extended Markup Language),是一种用于传输与存储数据的标记语言。它类似于 HTML,但 XML 的设计宗旨是传输数据,而非展示数据。由于其语义明确、结构清晰,被广泛运用于各种编程语言中,逐渐成为了数据传输和存储的重要手段。
在 Android 开发中,XML 作为 Android 应用的配置文件、资源文件存在,经常用于描述布局控件、应用参数、数据传递等。而在与服务器数据交互时,XML 数据的解析则显得尤为重要。
解析方式
在 Android 中,XML 数据的解析主要通过三种方式实现:
- SAX 解析
- DOM 解析
- Pull 解析
下面就分别对这三种方式进行详细讲解,并举例说明。
1. SAX 解析
SAX 解析器采用基于事件的模型来解析 XML 文件,按照程序员定义好的回调函数进行处理,从而逐行读取 XML 文件并将其转换成数据流,有效地避免了将整个文件读入内存的需求。
优点:
- 占用内存少,适用于处理大型 XML 文件
- 解析速度快
缺点:
- 缺乏灵活性,只能按照顺序逐个读取 XML 数据
- 编码稍微有些复杂,主要基于事件回调函数进行开发
在 Android 中,SAX 解析器的应用需要经过以下步骤:
- 创建 SAXParserFactory 和 SAXParser 对象
- 实现 DefaultHandler 类并重写各种回调函数
- 调用 SAXParser.parse 方法开始解析 XML 文件
以下是 SAX 解析器的示例代码:
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.d(TAG, "startElement: " + qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String data = new String(ch, start, length);
Log.d(TAG, "characters: " + data);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
Log.d(TAG, "endElement: " + qName);
}
};
InputStream inputStream = getResources().openRawResource(R.raw.data);
saxParser.parse(inputStream, handler);
} catch (Exception e) {
e.printStackTrace();
}
2. DOM 解析
DOM 解析器将整个 XML 文件解析成一棵 DOM 树,并遍历这棵树来获取数据,支持随时增删改查操作,较适用于数据量不大的 XML 文件。
优点:
- 可以进行增删改查等操作,处理灵活性高
- API 简单易用
缺点:
- 基于整个文档的树形结构,占用内存较大,适用于数据量较小的 XML 文件
- 解析速度相对较慢
在 Android 中,DOM 解析器的应用需要经过以下步骤:
- 创建 DocumentBuilderFactory 和 DocumentBuilder 对象
- 获取 Document 实例并解析 XML 文件
- 遍历 DOM 树并获取数据
以下是 DOM 解析器的示例代码:
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream inputStream = getResources().openRawResource(R.raw.data);
Document document = builder.parse(inputStream);
Element root = document.getDocumentElement();
NodeList nodeList = root.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element bookElement = (Element) nodeList.item(i);
String bookId = bookElement.getAttribute("id");
String bookName = bookElement.getElementsByTagName("name")
.item(0).getTextContent();
String bookPrice = bookElement.getElementsByTagName("price")
.item(0).getTextContent();
Log.d(TAG, "book: id=" + bookId + ", name=" + bookName + ", price=" + bookPrice);
}
} catch (Exception e) {
e.printStackTrace();
}
3. Pull 解析
Pull 解析器以迭代方式逐个获取 XML 中的每个元素并与程序进行交互,适用于大型文档的处理以及快速获取特定元素。
优点:
- 基于流,占用内存小,适合大型 XML 文件的解析
- 解析速度较快
- 灵活性较高
缺点:
- 编码稍稍复杂
在 Android 中,Pull 解析器的应用需要经过以下步骤:
- 创建 XmlPullParser 对象
- 设置输入源并解析 XML 文件
- 逐行读取 XML 文件,处理解析数据
以下是 Pull 解析器的示例代码:
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
InputStream inputStream = getResources().openRawResource(R.raw.data);
xmlPullParser.setInput(inputStream, "utf-8");
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "start document");
break;
case XmlPullParser.START_TAG:
String name = xmlPullParser.getName();
if ("book".equals(name)) {
String bookId = xmlPullParser.getAttributeValue(null, "id");
Log.d(TAG, "book start: id=" + bookId);
} else if ("name".equals(name)) {
String bookName = xmlPullParser.nextText();
Log.d(TAG, "name: " + bookName);
} else if ("price".equals(name)) {
String bookPrice = xmlPullParser.nextText();
Log.d(TAG, "price: " + bookPrice);
}
break;
case XmlPullParser.END_TAG:
String endName = xmlPullParser.getName();
if ("book".equals(endName)) {
Log.d(TAG, "book end");
}
break;
}
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
示例说明
在 Android 中,XML 格式的各种数据应用广泛,比如通过 Web 服务获取数据、在应用程序中自定义控件、配置系统参数和应用界面布局以及描述序列化对象等。
其中 DOM 解析方式显得更适合于前端开发中大部分场景,适合于数据量不大而需要经常读取 XML 文件中的数据,代码相对较简单易用。
例如:通过解析 XML 文件来实现数据的初始化并更新 UI 界面,假设有下面的 XML 配置文件:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book id="001">
<name>Android Develop</name>
<price>36</price>
</book>
<book id="002">
<name>Java Develop</name>
<price>26</price>
</book>
</books>
可以采用以下代码段,使用 DOM 解析方式解析 XML 文件并展示数据在 UI 界面中:
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream inputStream = getResources().openRawResource(R.raw.data);
Document document = builder.parse(inputStream);
Element root = document.getDocumentElement();
NodeList nodeList = root.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element bookElement = (Element) nodeList.item(i);
String bookId = bookElement.getAttribute("id");
String bookName = bookElement.getElementsByTagName("name")
.item(0).getTextContent();
String bookPrice = bookElement.getElementsByTagName("price")
.item(0).getTextContent();
// 展示数据在 UI 界面中
TextView textView = new TextView(this);
textView.setText("id=" + bookId + ", name=" + bookName + ", price=" + bookPrice);
linearLayout.addView(textView, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
));
}
} catch (Exception e) {
e.printStackTrace();
}
综上,这就是 Android XML 数据的三种解析方式的详细攻略,开发者可以根据不同情况灵活选择不同的方式进行处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android XML数据的三种解析方式 - Python技术站