📅  最后修改于: 2021-01-05 08:32:33             🧑  作者: Mango
XML文档通常用于在Internet上共享数据。以XML格式提供的数据能够经常更新,并且解析它们是基于网络的应用程序的常见任务。
在Android中,有三种类型的XML解析器可以解析XML数据并在android应用程序中读取它们,它们是:
Android DOM(文档对象模型)解析器使用基于对象的方法来创建和解析android应用程序中的XML文件。 DOM解析器将XML文件加载到内存中以解析XML文档。由于这个原因,它消耗更多的内存。
在此示例中,我们解析XML数据并将其显示在ListView中。
在activity_main.xml布局中添加ListView。
在资产目录中创建XML文档empdetail.xml,以使用DOM解析器解析数据。
Sachin Kumar
50000
Developer
Rahul Kumar
60000
Team Leader
John Mike
70000
Manager
Ajay Kumar
45000
Developer
Toni Nayer
55000
Marketing
Mr Bony
42000
Sales
Raj Kumar
30000
Production
Rahul Kumar
60000
Team Leader
John Mike
70000
Manager
Sachin Kumar
50000
Developer
Rahul Kumar
60000
Team Leader
John Mike
70000
Manager
创建一个自定义布局以将数据列表显示到ListView中。
添加以下代码以使用DOM解析器读取和解析XML数据。创建DocumentBuilderFactory,DocumentBuilder和Document对象的实例。
HashMap
package example.javatpoint.com.kotlinxmlparsingusingdomparser
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ListView
import android.widget.SimpleAdapter
import org.w3c.dom.Element
import org.w3c.dom.Node
import org.xml.sax.SAXException
import java.io.IOException
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.ParserConfigurationException
class MainActivity : AppCompatActivity() {
var empDataHashMap = HashMap()
var empList: ArrayList> = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try {
val lv = findViewById(R.id.listView)
val istream = assets.open("empdetail.xml")
val builderFactory = DocumentBuilderFactory.newInstance()
val docBuilder = builderFactory.newDocumentBuilder()
val doc = docBuilder.parse(istream)
//reading the tag "employee" of empdetail file
val nList = doc.getElementsByTagName("employee")
for (i in 0 until nList.getLength()) {
if (nList.item(0).getNodeType().equals(Node.ELEMENT_NODE) ) {
//creating instance of HashMap to put the data of node value
empDataHashMap = HashMap()
val element = nList.item(i) as Element
empDataHashMap.put("name", getNodeValue("name", element))
empDataHashMap.put("salary", getNodeValue("salary", element))
empDataHashMap.put("designation", getNodeValue("designation", element))
//adding the HashMap data to ArrayList
empList.add(empDataHashMap)
}
}
val adapter = SimpleAdapter(this@MainActivity, empList, R.layout.custom_list, arrayOf("name", "salary", "designation"), intArrayOf(R.id.name, R.id.salary, R.id.designation))
lv.setAdapter(adapter)
} catch (e: IOException) {
e.printStackTrace()
} catch (e: ParserConfigurationException) {
e.printStackTrace()
} catch (e: SAXException) {
e.printStackTrace()
}
}
// function to return node value
protected fun getNodeValue(tag: String, element: Element): String {
val nodeList = element.getElementsByTagName(tag)
val node = nodeList.item(0)
if (node != null) {
if (node.hasChildNodes()) {
val child = node.getFirstChild()
while (child != null) {
if (child.getNodeType() === Node.TEXT_NODE) {
return child.getNodeValue()
}
}
}
}
return ""
}
}
输出: