XML文件解析分四类方式:DOM解析;SAX解析;JDOM解析;DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。目前已经完成一种方式的封装基于DOM的XML文件解析类。
语言我依然采用了Groovy模式,有兴趣的同学可以去看看:从Java到Groovy的八级进化论。还有更多高级特性实践可以在公众号里面搜Groovy即可,包括在JMeter中支持Java(即Groovy)脚本。
xml文件内容(已删节);
value="Export from zookeeper configuration group: [/xdfapp/DCSS] - [v1.0] - [unchange]."/>
value="Export from zookeeper configuration group: [/xdfapp/ailearn-work-svr] - [v1.0] - [unchange]."/>
工具类:
package com.fun.utils.xml
import com.fun.base.exception.FailException
import com.fun.frame.SourceCode
import org.dom4j.*
import org.dom4j.io.SAXReader
import org.slf4j.Logger
import org.slf4j.LoggerFactory
/**
* 基于dom4j解析xml工具类
*/
class XMLUtil2 extends SourceCode {
private static Logger logger = LoggerFactory.getLogger(XMLUtil2.class)
static List parse(String path) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read(path.startsWith("http") ? new URL(path) : new File(path));
Element rootElement = document.getRootElement();
def iterator = rootElement.elementIterator()
List info = new ArrayList<>()
while (iterator.hasNext()) {
info << parseNode(iterator.next() as Element)
}
return info;
} catch (DocumentException e) {
logger.error("解析文件${path}失败!", e)
}
FailException.fail("解析文件${path}失败!")
}
static NodeInfo parseNode(Element e) {
if (e.getNodeType() != Node.ELEMENT_NODE) return null;
def info = new NodeInfo()
List attributes = e.attributes();
List attrs = new ArrayList<>()
attributes.each {
attrs << new Attr(it.name, it.value)
}
info.setAttrs(attrs)
List children = new ArrayList<>()
def iterator = e.elementIterator()
if (iterator.hasNext()) {
children << parseNode(iterator.next() as Element)
}
info.setChildren(children)
return info;
}
}
控制台输出:
内容较多,分成了头尾两张。
公众号FunTester首发,原创分享爱好者,腾讯云和掘金社区首页推荐,知乎七级原创作者,欢迎关注、交流,禁止第三方擅自转载。
FunTester热文精选