Android中基于XmlPullParser和DocumentBuilderFactory的XML解析 记录

这篇具有很好参考价值的文章主要介绍了Android中基于XmlPullParser和DocumentBuilderFactory的XML解析 记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

XmlPullParser(Java版)

以下是XmlPullParser解析XML文件的常见方法及说明:

1. XmlPullParserFactory.newInstance():创建XmlPullParserFactory实例。

2. XmlPullParserFactory.setNamespaceAware(boolean):设置是否支持XML命名空间。

3. XmlPullParserFactory.setValidating(boolean):设置是否支持DTD验证。

4. XmlPullParserFactory.newPullParser():创建XmlPullParser实例。

5. XmlPullParser.setInput(InputStream, String):设置要解析的XML文件的输入流和编码方式。

6. XmlPullParser.getEventType():获取当前解析器的事件类型。

7. XmlPullParser.getName():获取当前节点的名称。

8. XmlPullParser.getText():获取当前节点的文本内容。

9. XmlPullParser.next():移动到下一个节点。

10. XmlPullParser.nextTag():移动到下一个标签节点。

11. XmlPullParser.getAttributeCount():获取当前节点的属性数量。

12. XmlPullParser.getAttributeName(int):获取当前节点指定位置的属性名称。

13. XmlPullParser.getAttributeValue(int):获取当前节点指定位置的属性值。

14. XmlPullParser.getDepth():获取当前节点的深度。

15. XmlPullParser.END_DOCUMENT:表示已经到达XML文件的末尾。

16. XmlPullParser.START_TAG:表示当前节点是一个标签节点。

17. XmlPullParser.END_TAG:表示当前节点是一个结束标签节点。

解析顺序: 开始的标签事件 ----> 文本事件 ----> 然后结束的标签事件

例如:

<?xml version="1.0" encoding="utf-8"?>
<keys>
    <board id="xml1">1
        <source>android 01</source>2
        <source>android 02</source>2
        <source>android 03</source>2
    </board>
    <board id="xml2">1
        <source>ios 01</source>3
        <source>ios 02</source>3
        <source>ios 05</source>3
    </board>4
</keys>

解析代码:

    private void parseData(){

        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            InputStream inputStream = getAssets().open("text.xml");
            parser.setInput(inputStream,"utf-8");
            int eventType = parser.getEventType();
            String board = "";
            while (eventType != XmlPullParser.END_DOCUMENT){
                switch (eventType) {
                    case XmlPullParser.TEXT:
                        Log.d(TAG, "parseData: text  " + parser.getName() + "       " + parser.getText());
                        break;
                    case XmlPullParser.START_TAG:
                        String keys = parser.getName();
                        Log.d(TAG, "parseData: start -----" + parser.getName());
                        if (keys.equals("board")) {
                            board = parser.getAttributeValue(null, "id");
                        }
                        if (board.equals("xml1")) {
                            if (keys.equals("source")) {
//                                String result = parser.getText();
//                                Log.d(TAG, "initData: result = " + result);
//                                parser.next(); // 移动解析器到下一个事件,即 TEXT 事件
//                                String result = parser.getText();
//                                Log.d(TAG, "initData: result = " + result);
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        Log.d(TAG, "initData: end -------" + parser.getName());
                        break;
                }
                eventType = parser.next();

            }

        } catch (IOException | XmlPullParserException e) {
            throw new RuntimeException(e);
        }

    }

运行结果:

2023-06-06 14:35:41.553 22162-22162 MainActivity            com.example.third                    D  parseData: start -----keys
2023-06-06 14:35:41.553 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       
                                                                                                        
2023-06-06 14:35:41.553 22162-22162 MainActivity            com.example.third                    D  parseData: start -----board
2023-06-06 14:35:41.553 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       1
                                                                                                            
2023-06-06 14:35:41.553 22162-22162 MainActivity            com.example.third                    D  parseData: start -----source
2023-06-06 14:35:41.553 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       android 01
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  initData: end -------source
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       2
                                                                                                            
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: start -----source
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       android 02
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  initData: end -------source
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       2
                                                                                                            
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: start -----source
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       android 03
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  initData: end -------source
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       2
                                                                                                        
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  initData: end -------board
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       
                                                                                                        
2023-06-06 14:35:41.554 22162-22162 MainActivity            com.example.third                    D  parseData: start -----board
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       1
                                                                                                            
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: start -----source
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       ios 01
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  initData: end -------source
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       3
                                                                                                            
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: start -----source
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       ios 02
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  initData: end -------source
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       3
                                                                                                            
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: start -----source
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       ios 05
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  initData: end -------source
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       3
                                                                                                        
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  initData: end -------board
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  parseData: text  null       4
2023-06-06 14:35:41.555 22162-22162 MainActivity            com.example.third                    D  initData: end -------keys

DocumentBuilderFactory(kotlin版)

以下是org.w3c.dom.Node的常见方法及使用说明:

1. getNodeName():获取节点的名称。

2. getNodeValue():获取节点的值。

3. getNodeType():获取节点的类型,返回一个整数值,具体取值如下:

- ELEMENT_NODE(1):元素节点
- ATTRIBUTE_NODE(2):属性节点
- TEXT_NODE(3):文本节点
- CDATA_SECTION_NODE(4):CDATA节点
- ENTITY_REFERENCE_NODE(5):实体引用节点
- ENTITY_NODE(6):实体节点
- PROCESSING_INSTRUCTION_NODE(7):处理指令节点
- COMMENT_NODE(8):注释节点
- DOCUMENT_NODE(9):文档节点
- DOCUMENT_TYPE_NODE(10):文档类型节点
- DOCUMENT_FRAGMENT_NODE(11):文档片段节点
- NOTATION_NODE(12):符号节点

4. getChildNodes():获取节点的子节点列表,返回一个NodeList对象。

  1. getParentNode():获取节点的父节点,返回一个Node对象。

  2. getAttributes():获取节点的属性列表,返回一个NamedNodeMap对象。

  3. hasChildNodes():判断节点是否有子节点,返回一个布尔值。

  4. getTextContent():获取节点的文本内容,返回一个字符串。

  5. getFirstChild():获取节点的第一个子节点,返回一个Node对象。

  6. getLastChild():获取节点的最后一个子节点,返回一个Node对象。

  7. getNextSibling():获取节点的下一个兄弟节点,返回一个Node对象。

  8. getPreviousSibling():获取节点的上一个兄弟节点,返回一个Node对象。

测试用例所使用xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <!--我是注释,也能被解析出来-->
    <A>Apple</A>
    我是A和B中间的文本
    <B>Banana</B>
    <C>我是C文本
        <D>Dog</D>我是D和E之间的文本
        <E>elephant</E>
    </C>我是C和F之间的文本
    <F>foot</F>我是F和G之间的文本
    <G>god</G>
</config>

测试用例代码:

fun main() {
    try {
        val factory = DocumentBuilderFactory.newInstance()
        val builder = factory.newDocumentBuilder()
        val file = File("D:\\DevSpace\\IDEA\\Project\\GUIProject\\src\\kotlinLearning\\config.xml")
        if(file.exists()){
            val stream = file.inputStream()
            val document = builder.parse(stream)
            val rootElement = document.documentElement
            println("${rootElement.tagName}   ${rootElement.nodeName}  ${rootElement.nodeValue}")
            println("============================================================================")
            val nodeList = rootElement.childNodes
            for(i in 0 until nodeList.length){
                val configNode : Node = nodeList.item(i)
                //单独判断C,有子标签的
                if(configNode.nodeName == "C"){
                    val element =  configNode as Element
                    println("tagName: ${element.tagName}  节点name: ${element.nodeName}  节点值: ${element.nodeValue} ")
                    val childNodes = element.childNodes
                    for (j in 0 until childNodes.length){
                        val child = childNodes.item(j)
                        if(child.nodeType == Element.ELEMENT_NODE){
                            val firstChild = child.firstChild
                            val nodeValue = firstChild.nodeValue
                            val nodeName = firstChild.nodeName
                            println("launcherInfo子节点的名为:$nodeName   值为:$nodeValue")
                        }

                    }
                }else{
                    println("Node的类型为: ${configNode.nodeType}   Node的名字为: ${configNode.nodeName}  Node的值为: ${configNode.nodeValue}   Node的子值为: ${configNode.firstChild?.nodeValue}")
                }
            }
        }else{
            println(file.absoluteFile)
            println("文件不存在")
        }
    }catch (e:Exception){
        e.stackTrace
    }

}

运行结果:文章来源地址https://www.toymoban.com/news/detail-492616.html

config   config  null
============================================================================
Node的类型为: 3   Node的名字为: #text  Node的值为: 
       Node的子值为: null
Node的类型为: 8   Node的名字为: #comment  Node的值为: 我是注释,也能被解析出来   Node的子值为: null
Node的类型为: 3   Node的名字为: #text  Node的值为: 
       Node的子值为: null
Node的类型为: 1   Node的名字为: A  Node的值为: null   Node的子值为: Apple
Node的类型为: 3   Node的名字为: #text  Node的值为: 
    我是A和B中间的文本
       Node的子值为: null
Node的类型为: 1   Node的名字为: B  Node的值为: null   Node的子值为: Banana
Node的类型为: 3   Node的名字为: #text  Node的值为: 
       Node的子值为: null
tagName: C  节点name: C  节点值: null 
launcherInfo子节点的名为:#text   值为:Dog
launcherInfo子节点的名为:#text   值为:elephant
Node的类型为: 3   Node的名字为: #text  Node的值为: 我是C和F之间的文本
       Node的子值为: null
Node的类型为: 1   Node的名字为: F  Node的值为: null   Node的子值为: foot
Node的类型为: 3   Node的名字为: #text  Node的值为: 我是F和G之间的文本
       Node的子值为: null
Node的类型为: 1   Node的名字为: G  Node的值为: null   Node的子值为: god
Node的类型为: 3   Node的名字为: #text  Node的值为: 
   Node的子值为: null

解析说明:(把例子拷贝一下跑一遍,对照着xml文件以及上面的函数解析,就可以理解了)

1. 标签中有值的话需要拿该标签中间的value不能直接getValue而是需要获取它的第一个子节点(也可以理解成标签)的value, 这个value就是我们要拿到的value(可以结合上述例子理解,具体解析原理我没看源码也不太清楚)

到了这里,关于Android中基于XmlPullParser和DocumentBuilderFactory的XML解析 记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • xml系列篇之xml解析

    接下来看看由辉辉所写的关于xml的相关操作吧 目录 🥳🥳Welcome Huihui\\\'s Code World ! !🥳🥳 是什么 为什么要使用 优点 💡辉辉小贴士:xml在数据库辅助类中的应用 💡辉辉小贴士:怎么获取不同位置下的配置文件呢? 怎么使用 1.DOM4J 代码示例 2. XPath 代码示例 3. SAX 4. StAX 5. JAXB

    2024年02月10日
    浏览(19)
  • 38.Python从入门到精通—Python3 XML 解析 什么是 XML Python 对 XML 的解析

    XML(可扩展标记语言)是一种用于描述数据的标记语言,它可以用于表示各种类型的数据,包括文本、图像、音频、视频等。XML 的语法类似于HTML,但它更加灵活,可以自定义标记,并且不依赖于任何特定的应用程序或操作系统。 XML的基本结构由元素、属性和文本组成。元素

    2024年04月11日
    浏览(11)
  • 【JAVA】XML及其解析技术、XML检索技术、设计模式

    XML(Extensible Markup Language)是可扩展标记语言的缩写,它是一种数据表示格式,可以描述复杂的数据结构,常用于传输和存储数据 作用: 用于进行存储数据和传输数据 作为软件的配置文件 第一行是文档声明 ? xml version =\\\"1.0\\\" encoding =\\\"UTF-8\\\" ? version:XML默认的版本号码、该属性是必

    2024年02月11日
    浏览(16)
  • XML解析

    XML解析

    XML在以后更多的是用来作为配置文件的。 什么是配置文件 用来保存程序在运行时需要的一些参数。  当配置信息比较复杂的时候,我们就可以用XML。   根标签就是写在最外面的标签。  XML文件可以作为软件的配置文件, 软件刚开始运行的时候第一步要去读取并解析XML文件里

    2024年02月01日
    浏览(8)
  • Mapper.xml文件解析

     最近在做一个分布式项目,看到xml文件原先只是上网CV,还是要搞清楚吧! 下面是一个Mybatis的SQL映射文件的配置 这个元素定义了命名空间,用于标识这个映射文件对应的接口。在这里,命名空间指向了 cn.itedus.lottery.infrastructure.dao.IActivityDao 这个接口,表示这个映射文件用

    2024年02月10日
    浏览(26)
  • QT解析xml文件

    mainwindow.cpp  mainwindow.h

    2024年02月14日
    浏览(12)
  • java解析xml文件

    MyContentHandler类继承自DefaultHandler,是一个自定义的内容处理器。在该类中重写了startElement()、endElement()和characters()方法,以处理XML解析的不同事件。

    2024年02月13日
    浏览(14)
  • Jacoco XML 解析

    Jacoco XML 解析

    1. DOM解析器: ○ 优点:易于使用,提供完整的文档树,可以方便地修改和遍历XML文档。 ○ 缺点:对大型文档消耗内存较多,加载整个文档可能会变慢。 ○ 适用场景:适合小型XML文档或需要多次访问和修改XML内容的情况。 2. SAX解析器: ○ 优点:逐个处理XML元素,节省内存

    2024年02月11日
    浏览(4)
  • Python XML 解析

    XML 指可扩展标记语言(e X tensible M arkup L anguage)。 你可以通过本站学习 XML 教程 XML 被设计用来传输和存储数据。 XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、

    2024年02月14日
    浏览(9)
  • 解析XML文件

    什么是XML? xml指可扩展语言(extendsible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 xml被设计用来传输和存储数据。 xml是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言,

    2024年02月06日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包