dom4j解析xml实战

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


1dc618a0ed9580ce8bfa6facb208c08f.png

3条全部解析完毕!!!


大功告成!!



相关文章
|
3月前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
122 14
|
8天前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
|
2月前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
80 20
|
15天前
|
数据可视化 测试技术 API
GraphQL开发工具选型指南:Apipost高效调试与文档生成实战解析
本文深入解析了GraphQL开发工具Apipost在高效调试与文档生成方面的优势,对比同类工具Apifox,突出其可视化界面、实时调试及自动化文档生成等特性。Apipost通过智能代码补全、错误提示等功能简化复杂Query编写,支持一键生成标准化文档,显著提升开发效率和团队协作效果,尤其适合中大型团队应对复杂业务场景。
|
2月前
|
供应链 搜索推荐 API
深度解析1688 API对电商的影响与实战应用
在全球电子商务迅猛发展的背景下,1688作为知名的B2B电商平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口,为开发者和电商企业提供数据资源和功能支持。本文将深入解析1688 API的功能(如商品搜索、详情、订单管理等)、应用场景(如商品展示、搜索优化、交易管理和用户行为分析)、收益分析(如流量增长、销售提升、库存优化和成本降低)及实际案例,帮助电商从业者提升运营效率和商业收益。
252 20
|
3月前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
271 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
3月前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
233 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
2月前
|
数据采集 XML API
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
深入解析BeautifulSoup:从sohu.com视频页面提取关键信息的实战技巧
|
3月前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
3月前
|
数据采集 DataWorks 搜索推荐
阿里云DataWorks深度评测:实战视角下的全方位解析
在数字化转型的大潮中,高效的数据处理与分析成为企业竞争的关键。本文深入评测阿里云DataWorks,从用户画像分析最佳实践、产品体验、与竞品对比及Data Studio公测体验等多角度,全面解析其功能优势与优化空间,为企业提供宝贵参考。
204 13

热门文章

最新文章

推荐镜像

更多