欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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]


参考资料:

1、XML DOM 教程

2、使用DOM解析XML文件

3、解析XML数据

相关标签: xml