dom4j解析xml实战

简介: dom4j解析xml实战


前言

最近有个同事说一个xml解析,说是很复杂。然后让我给看看。我给解析完了。现在分享下,希望如果遇到同样问题的朋友随时可以借鉴参考。

所谓的复杂xml

<?xml version="1.0" encoding="UTF-8"?>
<getOutptTplAsnResponse xmlns="http://tempuri.org/">
    <getOutptTplAsnResult>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns=""
                   xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
            <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
                <xs:complexType>
                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="ds">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="SHPMT_NBR" type="xs:string" minOccurs="0"/>
                                    <xs:element name="TO_WHSE" type="xs:string" minOccurs="0"/>
                                    <xs:element name="ASN_NBR" type="xs:string" minOccurs="0"/>
                                    <xs:element name="ASN_NBR_DTL" type="xs:string" minOccurs="0"/>
                                    <xs:element name="SEASON" type="xs:string" minOccurs="0"/>
                                    <xs:element name="SIZE_DESC" type="xs:string" minOccurs="0"/>
                                    <xs:element name="REC_QTY" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="BATCH_NBR" type="xs:string" minOccurs="0"/>
                                    <xs:element name="MFG_DATE" type="xs:dateTime" minOccurs="0"/>
                                    <xs:element name="XPIRE_DATE" type="xs:dateTime" minOccurs="0"/>
                                    <xs:element name="INV_LOCK" type="xs:string" minOccurs="0"/>
                                    <xs:element name="PROC_STAT_CODE" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="CREATE_DATE_TIME" type="xs:dateTime" minOccurs="0"/>
                                    <xs:element name="USER_ID" type="xs:string" minOccurs="0"/>
                                    <xs:element name="SKU_ATTR_1" type="xs:string" minOccurs="0"/>
                                    <xs:element name="ASN_ORGN_TYPE" type="xs:string" minOccurs="0"/>
                                    <xs:element name="OUT_NBR" type="xs:string" minOccurs="0"/>
                                    <xs:element name="UNITS_RCVD" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="CARRIER_DATE" type="xs:dateTime" minOccurs="0"/>
                                    <xs:element name="TO_DATE" type="xs:dateTime" minOccurs="0"/>
                                    <xs:element name="CARRIER_COMPANY" type="xs:string" minOccurs="0"/>
                                    <xs:element name="CARRIER_CITY" type="xs:string" minOccurs="0"/>
                                    <xs:element name="MAX_DATE" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="CARRIER_TYPE" type="xs:string" minOccurs="0"/>
                                    <xs:element name="CASE" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="UNITS" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="TEMPERATURE" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="TEMP_OUT" type="xs:string" minOccurs="0"/>
                                    <xs:element name="COLD_CARRIER" type="xs:string" minOccurs="0"/>
                                    <xs:element name="SAMP_CASES" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="SAMP_UNITS" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="OUTPT_ASN_ID" type="xs:decimal" minOccurs="0"/>
                                    <xs:element name="CARTON_TYPE" type="xs:string" minOccurs="0"/>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:choice>
                </xs:complexType>
            </xs:element>
        </xs:schema>
        <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"
                         xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
            <NewDataSet xmlns="">
                <ds diffgr:id="ds1" msdata:rowOrder="0">
                    <SHPMT_NBR>000009459</SHPMT_NBR>
                    <TO_WHSE>SY1</TO_WHSE>
                    <ASN_NBR_DTL>000009459</ASN_NBR_DTL>
                    <SEASON>CS</SEASON>
                    <SIZE_DESC>000008</SIZE_DESC>
                    <REC_QTY>5</REC_QTY>
                    <BATCH_NBR>20210824</BATCH_NBR>
                    <MFG_DATE>2021-02-01T00:00:00+08:00</MFG_DATE>
                    <XPIRE_DATE>2029-02-02T00:00:00+08:00</XPIRE_DATE>
                    <INV_LOCK>1</INV_LOCK>
                    <PROC_STAT_CODE>0</PROC_STAT_CODE>
                    <CREATE_DATE_TIME>2021-08-24T16:12:01+08:00</CREATE_DATE_TIME>
                    <USER_ID>xxx</USER_ID>
                    <ASN_ORGN_TYPE>P</ASN_ORGN_TYPE>
                    <UNITS_RCVD>5</UNITS_RCVD>
                    <MAX_DATE>0</MAX_DATE>
                    <CASE>0</CASE>
                    <UNITS>0</UNITS>
                    <TEMPERATURE>0</TEMPERATURE>
                    <SAMP_CASES>0</SAMP_CASES>
                    <SAMP_UNITS>0</SAMP_UNITS>
                    <OUTPT_ASN_ID>20500</OUTPT_ASN_ID>
                </ds>
                <ds diffgr:id="ds2" msdata:rowOrder="1">
                    <SHPMT_NBR>CSP0058229</SHPMT_NBR>
                    <TO_WHSE>SY1</TO_WHSE>
                    <ASN_NBR>JD-2022-05-24-0003</ASN_NBR>
                    <ASN_NBR_DTL>620</ASN_NBR_DTL>
                    <SEASON>CS</SEASON>
                    <SIZE_DESC>020100003</SIZE_DESC>
                    <REC_QTY>8</REC_QTY>
                    <BATCH_NBR>2022-403</BATCH_NBR>
                    <MFG_DATE>2021-02-01T00:00:00+08:00</MFG_DATE>
                    <XPIRE_DATE>2029-03-03T00:00:00+08:00</XPIRE_DATE>
                    <INV_LOCK>1</INV_LOCK>
                    <PROC_STAT_CODE>0</PROC_STAT_CODE>
                    <CREATE_DATE_TIME>2022-05-24T10:35:15+08:00</CREATE_DATE_TIME>
                    <USER_ID>xx</USER_ID>
                    <ASN_ORGN_TYPE>P</ASN_ORGN_TYPE>
                    <UNITS_RCVD>10</UNITS_RCVD>
                    <MAX_DATE>0</MAX_DATE>
                    <CASE>0</CASE>
                    <UNITS>0</UNITS>
                    <TEMPERATURE>0</TEMPERATURE>
                    <SAMP_CASES>0</SAMP_CASES>
                    <SAMP_UNITS>0</SAMP_UNITS>
                    <OUTPT_ASN_ID>26174</OUTPT_ASN_ID>
                </ds>
                <ds diffgr:id="ds3" msdata:rowOrder="2">
                    <SHPMT_NBR>CSP0058229</SHPMT_NBR>
                    <TO_WHSE>SY1</TO_WHSE>
                    <ASN_NBR>JD-2022-05-24-0003</ASN_NBR>
                    <ASN_NBR_DTL>620</ASN_NBR_DTL>
                    <SEASON>CS</SEASON>
                    <SIZE_DESC>020100003</SIZE_DESC>
                    <REC_QTY>2</REC_QTY>
                    <BATCH_NBR>20323-1</BATCH_NBR>
                    <MFG_DATE>2021-02-03T00:00:00+08:00</MFG_DATE>
                    <XPIRE_DATE>2029-04-02T00:00:00+08:00</XPIRE_DATE>
                    <INV_LOCK>1</INV_LOCK>
                    <PROC_STAT_CODE>0</PROC_STAT_CODE>
                    <CREATE_DATE_TIME>2022-05-24T10:35:15+08:00</CREATE_DATE_TIME>
                    <USER_ID>xxxxx</USER_ID>
                    <ASN_ORGN_TYPE>P</ASN_ORGN_TYPE>
                    <UNITS_RCVD>10</UNITS_RCVD>
                    <MAX_DATE>0</MAX_DATE>
                    <CASE>0</CASE>
                    <UNITS>0</UNITS>
                    <TEMPERATURE>0</TEMPERATURE>
                    <SAMP_CASES>0</SAMP_CASES>
                    <SAMP_UNITS>0</SAMP_UNITS>
                    <OUTPT_ASN_ID>26175</OUTPT_ASN_ID>
                </ds>
            </NewDataSet>
        </diffgr:diffgram>
    </getOutptTplAsnResult>
</getOutptTplAsnResponse>

解析思路

使用dom4j技术,以 >为标示符,进行分割,获取到想要获取数据的上一层,然后通过getElement获取一个元素或者getElements获取一组相同标签数据。

解析实战

1.第一步引入 dom4j

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

2.引入我的xml解析工具类

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
/**
 * Dom4j读取Element
 *
 * @author hfl
 */
public class XmlUtil {
    private static Logger logger = LoggerFactory.getLogger(XmlUtil.class.getName());
    public static List<Element> getElements(Document document, String path) {
        return getElement(document, path).elements();
    }
    public static Element getElement(Document document, String path) {
        String[] paths = path.split(">");
        Element result = document.getRootElement();
        for (String item : paths) {
            try {
                result = result.element(item);
            } catch (Exception e) {
                logger.error("get element error: ", e);
            }
        }
        return result;
    }
    public static String getValue(Document document, String path) {
        String[] paths = path.split(">");
        Element result = document.getRootElement();
        for (String item : paths) {
            try {
                result = result.element(item);
            } catch (Exception e) {
                logger.error("get element error: ", e);
            }
        }
        return result.getText();
    }
    public static Document create() {
        // 创建一个xml文档
        Document doc = DocumentHelper.createDocument();
        Element university = doc.addElement("university");
        university.addAttribute("name", "tsu");
        // 注释
        university.addComment("这个是根节点");
        Element college = university.addElement("college");
        college.addAttribute("name", "cccccc");
        college.setText("text");
        return doc;
    }
    public static void write(Document doc) {
        try {
            File file = new File("src/dom4j-modify.xml");
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            XMLWriter out = new XMLWriter(new FileWriter(file));
            out.write(doc);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.开始解析测试类

@Slf4j
public class DomTest {
    @Test
    public void xmlToList() throws Exception {
        String path = "D:\\comp\\springboot2\\02\\vehicle-business\\vehicle-business-service\\src\\test\\java\\com\\wuzheng\\vehicle\\business\\domtest\\xmltest.xml";
        Document dom = new SAXReader().read(new File(path));
        List<Element> elist = XmlUtil.getElements(dom, "getOutptTplAsnResult>diffgram>NewDataSet");
        for (Element element : elist) {
            log.info("recordlist ----------------");
            Map<String, String> map = element.elements().stream().collect(Collectors.toMap(Element::getName, Element::getTextTrim));
            log.info("recordlist = {}", new Gson().toJson(map));
        }
    }
}
4.查看效果:

3条全部解析完毕!!!

大功告成!!



大功告成!!

相关文章
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
720 57
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3411 1
|
12月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
517 0
|
机器学习/深度学习 数据采集 JavaScript
用深度学习提升DOM解析——自动提取页面关键区块
本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。
622 13
用深度学习提升DOM解析——自动提取页面关键区块
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
724 15
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
604 0
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
465 1
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
535 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)

推荐镜像

更多
  • DNS