【XML解析】Dom解析XML

一、简述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]


参考资料:

1、XML DOM 教程

2、使用DOM解析XML文件

3、解析XML数据

扫描二维码关注公众号,回复: 165176 查看本文章

猜你喜欢

转载自blog.csdn.net/u012995888/article/details/80228581