dom4j解析xml实战

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

大功告成!!



大功告成!!

相关文章
|
17天前
|
自然语言处理 编译器 Linux
|
22天前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
36 6
|
19天前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
61 3
|
19天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
100 1
|
22天前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
25天前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
|
1月前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
73 1
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
64 2
|
1月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
12天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####