【XML解析】Dom解析XML
程序员文章站
2022-03-03 16:21:00
...
一、简述Dom解析XML特点
XML文档中每个成分都是一个节点,其节点类型主要分为三种:
- 元素节点:每个XML标签;
- 属性节点:每个XML标签的每个属性;
- 文本节点:每个XML标签的文本。
更多节点类型信息可看XML DOM 节点类型(Node Types)
Dom解析XML文档是一次性把整个文档读入内存,在内存中构建一个document文档树对象,通过DOM提供的API可以对文档树对象的每个节点进行操作。
二、举个例子
解析如下persons.xml
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person id="p1">
<name>小明</name>
<age>18</age>
</person>
<person id="p2">
<name>小华</name>
<age>23</age>
</person>
</persons>
dom解析xml逻辑类
import org.w3c.dom.Node
import java.io.InputStream
import java.util.ArrayList
import java.util.HashMap
import javax.xml.parsers.DocumentBuilderFactory
/**
* dom解析
* Created by Administrator on 2018/5/7.
*/
class DomXmlParser{
companion object {
fun parseXmlForList(inputStream: InputStream):ArrayList<HashMap<String,String>>{
var mapList = ArrayList<HashMap<String,String>>()
//文档生成器工程
var builderFactory = DocumentBuilderFactory.newInstance()
//文档生成器
var builder = builderFactory.newDocumentBuilder()
//文档
var document = builder.parse(inputStream)
//文档跟节点
var rootElementNode = document.documentElement
rootElementNode.normalize()
//遍历文档子子节点
var i= 0
var elementNode: Node
while (i<rootElementNode.childNodes.length){
//跟节点的子节点
elementNode = rootElementNode.childNodes.item(i)
//过滤空文本节点
if(elementNode.nodeType == Node.ELEMENT_NODE) {
var map = HashMap<String, String>()
var attsNodes = elementNode.attributes
var j = 0
while (j < attsNodes.length) {
var attsTag = attsNodes.item(j).nodeName
(map as HashMap<String, String>).put(attsNodes.item(j).nodeName, attsNodes.item(j).textContent)
j++
}
var sonElementNodes = elementNode.childNodes
//遍历子元素节点
var x =0
while (x<sonElementNodes.length){
var sonElementNode = sonElementNodes.item(x)
//过滤空文本节点
if(sonElementNode!=null && sonElementNode.nodeType == Node.ELEMENT_NODE){
(map as HashMap<String, String>).put(sonElementNode.nodeName,sonElementNode.firstChild.nodeValue)
}
x++
}
mapList.add(map as HashMap<String, String>)
}
i++
}
return mapList
}
}
}
调用测试
var inputStream = this.assets.open("persons.xml")
var mapList = DomXmlParser.parseXmlForList(inputStream)
if(mapList!=null && mapList.size>0) {
var sb = StringBuffer()
for (map in mapList) {
sb.append("${map.get("id")},${map.get("name")},${map.get("age")}\n")
}
tvDomParse = findViewById(R.id.tv_dom_parse_xml_result)
tvDomParse.text = sb.toString()
}
[完整demo]
参考资料:
3、解析XML数据
上一篇: Dom解析XML文件
下一篇: xml解析-dom解析