前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于DOM的XML文件解析类

基于DOM的XML文件解析类

作者头像
FunTester
发布于 2020-10-10 01:56:07
发布于 2020-10-10 01:56:07
73200
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

最近公司做服务配置检查,特别是zookeeper配置里面关于数据库redis域名的配置。刚好还没弄过XML解析,所以顺手封装了一个工具类。

XML文件解析分四类方式:「DOM解析」「SAX解析」「JDOM解析」「DOM4J解析」。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。

权衡之后我先选择了「DOM解析」,因为文件不大(1万行),只是一次性的脚本,不存在性能方面的考虑。

语言我依然采用了Groovy模式,不能不说太好用了,之前讲过如何在两个小时内容从Java过渡到Groovy,有兴趣的同学可以去看看:从Java到Groovy的八级进化论。还有更多高级特性实践可以在公众号里面搜Groovy即可,包括在JMeter中支持Java(即Groovy)脚本。

xml文件内容(已删节);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root path="/xdfapp">
    <zknode name="DCSS" value="38d9ab9f3e7b424324cea3e42fb1237f9e73bdb">
        <zknode name="v1.0$">
            <zknode name="unchange">
                <zknode name="datadb.database"
                        value="Export from zookeeper configuration group: [/xdfapp/DCSS] - [v1.0] - [unchange]."/>
                <zknode name="redis.host"/>
                <zknode name="db.host.w"/>
                <zknode name="datadb.password" value="127.0.0.1"/>
                <zknode name="datadb.host.r"/>
                <zknode name="db.host.r"/>
                <zknode name="datadb.host.w"/>
            </zknode>
        </zknode>
     </zknode>
</root>

下面分享Demo:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.fun.ztest.groovy


import com.fun.base.bean.AbstractBean
import com.fun.base.exception.FailException
import com.fun.frame.SourceCode
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.w3c.dom.Document
import org.w3c.dom.NamedNodeMap
import org.w3c.dom.Node
import org.w3c.dom.NodeList
import org.xml.sax.SAXException

import javax.xml.parsers.DocumentBuilder
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.ParserConfigurationException

class XMLUtil extends SourceCode {

    private static Logger logger = LoggerFactory.getLogger(XMLUtil.class)

    public static void main(String[] args) {
        def xml = parseXml("/Users/fv/Downloads/dev.xml", "root")
        output(xml)

    }

    public static List<NodeInfo> parseXml(String path, String root) {
        NodeList nodes = parseRoot(path, root)
        return range(nodes.getLength()).mapToObj {x -> parseNode(nodes.item(x))}.collect() as List
    }


    public static NodeList parseRoot(String path, String root) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance()
        try {
            DocumentBuilder db = dbf.newDocumentBuilder()
            Document document = db.parse(new File(path))
            NodeList bookList = document.getElementsByTagName(root)
            return bookList
        } catch (ParserConfigurationException e) {
            logger.error("解析配置错误!", e)
        } catch (IOException e) {
            logger.error("IO错误!", e)
        } catch (SAXException e) {
            logger.error("SAX错误!", e)
        }
        FailException.fail("解析文件:${path}中${root}节点出错!")
    }

    public static NodeInfo parseNode(Node node) {
        if (node.getNodeType() != node.ELEMENT_NODE) return null
        NodeInfo nodeInfo = new NodeInfo()
        NamedNodeMap attrs = node.getAttributes()
        List<Attr> nodeAttr = new ArrayList<>()
        range(attrs.getLength()).each {
            Node attr = attrs.item(it)
            String nodeName = attr.getNodeName()
            String nodeValue = attr.getNodeValue()
            Attr e = new Attr(nodeName, nodeValue)
            nodeAttr.add(e)

        }
        nodeInfo.arrts = nodeAttr
        short nodeType = node.getNodeType()
        if (nodeType != Node.ELEMENT_NODE) return nodeInfo
        NodeList childNodes = node.getChildNodes()
        List<NodeInfo> children = new ArrayList<>()
        childNodes.getLength()
        range(childNodes.getLength()).each {children.add(parseNode(childNodes.item(it)))}
        nodeInfo.children = children.findAll {it != null}
        return nodeInfo
    }

    static class NodeInfo extends AbstractBean {

        private static final long serialVersionUID = 568896512159847L

        List<Attr> arrts

        List<NodeInfo> children


    }

    static class Attr extends AbstractBean {

        private static final long serialVersionUID = -35484487563215649L

        String name

        String value

        public Attr(String name, String value) {
            this.name = name
            this.value = value
        }


    }
}

控制台输出:

内容较多,分成了头尾两张。

头部图片

尾部图片

公众号「FunTester」首发,原创分享爱好者,腾讯云和掘金社区首页推荐,知乎七级原创作者,欢迎关注、交流,禁止第三方擅自转载。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于DOM4J的XML文件解析类
XML文件解析分四类方式:DOM解析;SAX解析;JDOM解析;DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。目前已经完成一种方式的封装基于DOM的XML文件解析类。
FunTester
2020/10/19
7480
Java一分钟之-XML解析:DOM, SAX, StAX
在Java开发中,XML作为一种标准的数据交换格式,其解析技术尤为重要。Java提供了三种主要的XML解析方式:DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。本文将深入浅出地探讨这三种解析方式的原理、优缺点、常见问题、易错点及避免策略,并通过代码示例加以说明。
Jimaks
2024/06/01
4540
XML文件解析实践(DOM解析)
昨天完成了基于DOM的XML文件解析类,今天赶紧实践了一下,不得不说,实践中的坑还是很多的。
FunTester
2020/10/10
1.1K0
XML文件解析实践(DOM解析)
DOM解析XML文件
和上一篇一样,使用同样的数据点击打开链接 DOM将XML中的元素如下分解 要想取数据,可以参考如下方法; 具体实现代码如下: public class DomPersonService { publ
提莫队长
2019/03/01
9540
DOM解析XML文件
技术经验|Java-Web基础之XML解析JAXP-DOM
XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。
六月暴雪飞梨花
2023/09/24
2450
技术经验|Java-Web基础之XML解析JAXP-DOM
DOM解析
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件 根据 DOM,XML 文档中的每个成分都是一个节点。 DOM 是这样规定的: 整个文档是一个文档节点 每个 XML 标签是一个元素节点 包含在 XML 元素中的文本是文本节点 每一个 XML 属性是一个属性节点 注释属于注释节点 位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来
汤高
2018/01/11
1.1K0
DOM解析
[ java 工具类] xml字符串解析成Map(DOM解析)
package com.tencent.jungle.wechat.util; import com.google.inject.Singleton; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.pars
Tencent JCoder
2018/12/14
3.3K0
4-SIII-Android数据固化之Xml的Dom解析和存储
零、前言 Xml是一种应用广泛的标记语言,我们常见的html便是它的子集。形如:<XXX>xxx</XXX>组成的闭合标签 安卓的res目录下的xml想必大家都是否熟悉,它们最终都是在代码中被读取并解析发挥效果的 安卓的SharedPreferences是以Xml的形式存储数据的,就连AndroidManifest注意一看也是Xml 可以说xml涉及到了安卓的很多方面,我们并不陌生,Xml最大的好处就是解耦,容易复用和更换 安卓的Xml解析有Pull解析、Sax解析和Dom解析,这篇说Dom解析与
张风捷特烈
2018/09/29
7370
xml解析技术概述和使用Jaxp对xml文档进行dom解析
用dom和sax对xml文档进行解析,可以使用已开发的xml解析开发包,我们直接调用即可。xml解析开发包有:Jaxp(最差)、Jdom(一般)、dom4j(最好)。
MonroeCode
2018/01/12
1.2K0
java 解析 XML实例
package com.hseact.fecp.servlet; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.json.JSONObject; import org.json.XM
庞小明
2018/03/07
1.4K0
Java Document生成和解析XML(DOMHelper.createDocument()方法过期了)
参考:https://blog.csdn.net/p812438109/article/details/81807440
别先生
2020/12/01
6570
Java Document生成和解析XML(DOMHelper.createDocument()方法过期了)
浅谈几款XML文档解析工具以及优缺点
XML,一种可扩展标记语言,通常被开发人员用来传输和存储数据,定义也比较简单,通常如下方式开头,用来表述文档的一些信息。
Java极客技术
2024/04/25
4920
浅谈几款XML文档解析工具以及优缺点
Java---XML的解析(1)-DOM解析
本章只讲DOM解析。接下来还会学习Dom4j和StAX 解析技术 DOM解析: DOM解析一次将所有的元素全部加载到内存中:如有以下XML文档:
谙忆
2021/01/21
7390
Java---XML的解析(1)-DOM解析
Java解析XML(4种方法)「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135863.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/05
1.1K0
Java文件操作——XML文件的读取
文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输。所以XML在现今应用程序中是非常流行的。本文主要讲Java解析和生成XML。用于不同平台、不同设备间的数据共享通信。
Java团长
2018/08/03
3K0
JAVA增删改查XML文件
  最近总是需要进行xml的相关操作。   不免的要进行xml的读取修改等,于是上网搜索,加上自己的小改动,整合了下xml的常用操作。   读取XML配置文件   首先我们需要通过DocumentBuilderFactory获取xml文件的工厂实例。 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true);   创建文档对象
用户1154259
2018/01/17
1.5K0
JAVA增删改查XML文件
【Java 进阶篇】Java XML快速入门:理解、解析和生成XML
XML(可扩展标记语言)是一种常用于存储和交换数据的标记语言,而Java是一种强大的编程语言,它具有处理XML的能力。在本篇博客中,我们将探讨XML的基础知识,学习如何在Java中解析和生成XML文档,以及实际应用中如何处理XML数据。
繁依Fanyi
2023/10/25
3.2K0
【Java 进阶篇】Java XML快速入门:理解、解析和生成XML
Android开发:XML简介&DOM、PULL、SAX解析对比
XML(extensible Markup Language) ,是一种数据标记语言 & 传输格式
Carson.Ho
2019/02/22
1.1K0
XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件
noteless
2018/09/11
3.4K0
XML概念定义以及如何定义xml文件编写约束条件java解析xml   DTD XML Schema JAXP java xml解析 dom4j  解析 xpath dom sax
XML文件解析
在现在很多采用java开发的基于b/s结构的系统中,经常将一些配置参加放到一个xml文件中,然后在这个文件中取参数,这样减少了hard code的情况。下面这个类就是用来解析xml文件的。具体使用参考main方法的的写法。
源哥
2018/08/28
6.5K0
相关推荐
基于DOM4J的XML文件解析类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验