利用dom4j解析xml

简介: 利用dom4j解析xml

引言


最近有个项目需要解析xml 文件,获取其中的节点内容, 小编选择了一个编码简单又高效的dom4j来完成。


1、xml内容

<?xml version="1.0" encoding="UTF-8"?>
<RecognizeResult>
    <Speech Uri="/Sub/2019-12-03.3/file/5149-15892322607-20191202141010-rJKTcXfpB_datang.wav" Duration="252840">
        <ResultCode>0</ResultCode>
        <Confidence>100</Confidence>
        <Subject Name="RecognizeText">
            <Role Name="R0">
                <EndPoint Count="44">
                    <Item Begin="13340" End="13450">
                        <Text>喂。 </Text>
                        <Time>13340,13450 </Time>
                    </Item>
                    <Item Begin="15860" End="16240">
                        <Text>喂。 </Text>
                        <Time>15860,16240 </Time>
                    </Item>
                </EndPoint>
            </Role>
            <Role Name="R1">
                <EndPoint Count="35">
                    <Item Begin="17990" End="20080">
                        <Text>哎 喂 是 王 斌 先生 是吗 啊! </Text>
                        <Time>17990,18100 18100,18340 18340,18550 18550,18940 18940,19120 19120,19510 19510,19820 19860,20080 </Time>
                    </Item>
                    <Item Begin="20630" End="21190">
                        <Text>对 是啊! </Text>
                        <Time>20630,20860 20860,21190 </Time>
                    </Item>
                </EndPoint>
            </Role>
        </Subject>
    </Speech>
</RecognizeResult>

需求是,将其中的汉子分角色(R0,R1)解析出来,并且拼接成字符串,然后发送给消息队列。


2、引入jar包

  <dependency>
         <groupId>dom4j</groupId>
         <artifactId>dom4j</artifactId>
         <version>1.6.1</version>
     </dependency>

3、代码实现

package com.zj.zhijian.service;
import com.zqf.common.utils.DateUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @author zhenghao
 * @description: 解析xml
 * @date 2019/12/318:33
 */
@Service
public class ParseXmlService {
    private static Logger log = LoggerFactory.getLogger(ParseXmlService.class);
    @Value("${base.file.path}")
    private String baseFilePath;
    //获得文件 测试方法
    public void xmlFile() {
        //String toDayStartYMD = DateUtils.getToDayStartYMD();
        String date = "2019-12";
        for (int j = 1; j <= 4; j++) {
            String toDayStartYMD = date + "-0" + j;
            for (int i = 0; i < 24; i++) {
                String filePath = baseFilePath + toDayStartYMD + "." + i + "/file/";
                log.info("文件路径" + filePath);
                parseXml(filePath);
            }
        }
    }
    public void parseXml(String strFile) {
        try {
            long l = System.currentTimeMillis();
            List<String> R0List = new ArrayList<>();
            List<String> R1List = new ArrayList<>();
            File file = new File(strFile);
            String[] filePath = file.list();
            if (filePath == null || filePath.length <= 0) {
                return;
            }
            log.info("xml个数" + filePath.length);
            for (String s : filePath) {
                if (!s.contains(".xml")) {
                    continue;
                }
                String tempFilePath = strFile + s;
                //1.创建Reader对象
                SAXReader reader = new SAXReader();
                //2.加载xml
                Document document = reader.read(new File(tempFilePath));
                //3.获取根节点
                Element rootElement = document.getRootElement();
                StringBuilder sb = new StringBuilder();
                //4、获得指定子节点
                Element speechElement = rootElement.element("Speech");
                //5、获得节点属性
                Attribute duration = speechElement.attribute("Duration");
                String value = duration.getValue();
                int telLength = Integer.valueOf(value) / 1000;
                if (telLength <= 45) {
                    continue;
                }
                //默认返回第一节点
                Element subjectElement = speechElement.element("Subject");
                if (subjectElement == null) {
                    continue;
                }
                Iterator iterator3 = subjectElement.elementIterator();
                while (iterator3.hasNext()) {
                    Element roleElement = (Element) iterator3.next();
                    Attribute name = roleElement.attribute("Name");
                    Element endPointElement = roleElement.element("EndPoint");
                    //获得所有子节点
                    Iterator iterator1 = endPointElement.elementIterator();
                    while (iterator1.hasNext()) {
                        Element itemElement = (Element) iterator1.next();
                        Element textElement = itemElement.element("Text");
                        String stringValue = textElement.getStringValue();
                        if (name.getValue().equals("R0")) {
                            sb.append(stringValue);
                            R0List.add(stringValue);
                        } else {
                            R1List.add(stringValue);
                        }
                    }
                }
            }
            System.out.println(System.currentTimeMillis() - l);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

4、多种解析xml方式对比,请参考下面文章


https://blog.csdn.net/hao134838/article/details/103402694

目录
相关文章
|
11月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
316 57
|
6月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
1435 1
|
4月前
|
机器学习/深度学习 数据采集 JavaScript
用深度学习提升DOM解析——自动提取页面关键区块
本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。
142 13
用深度学习提升DOM解析——自动提取页面关键区块
|
6月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
165 15
|
5月前
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
|
11月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
11月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
11月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
11月前
|
JavaScript
HTML DOM 节点树
HTML DOM 节点是指在 HTML 文档对象模型中,文档中的所有内容都被视为节点。整个文档是一个文档节点,每个 HTML 元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。DOM 将文档表示为节点树,节点之间有父子和同胞关系。
|
11月前
|
JavaScript
HTML DOM 节点
HTML DOM(文档对象模型)将HTML文档视为节点树,其中每个部分都是节点:文档本身是文档节点,HTML元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。节点间存在父子及同胞关系,形成层次结构。