利用dom4j解析xml

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 利用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

目录
相关文章
|
28天前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
57 3
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
79 0
|
1月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
57 1
|
3月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
10天前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
62 8
|
1月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
25 3
|
5月前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容

推荐镜像

更多