JAVA JAXB 解析XML嵌套子节点为字符串

XML、JAXB(嵌套类等)的复杂序列化 对于 Map,它将是 HashMap,等等”这很方便,例如,当你编写一个与 Facebook 服务器交换消息的程序时,并且它们有一组分配的值。“实际上,这里的问题比 JSON 少得多,因为每个类都有一个唯一的标签,您可以使用标签来指定确切的类。我已经习惯了所有漂亮的东西,嵌入的标签,以及其他一切。“例如,如果您需要反序列化一组继承了共同祖先的元素,您可以使用 @XmlAny:注释”哦,对了,还有一件事。”将被转换为包含 Cat、Cat、Dog 和 Cat 对象的集合”“太好了,今天就到这里,去休息吧。 阅读详情

问题背景

近期项目中涉及接收xml入参数据自动映射到java实体,xml数据是以@RequestBody形式接收,通过javax.xml.bind.annotation注解来实现自动转换,但是在xml数据中有一个子节点内的数据是非固定格式的数据,里面的各个元素的标签是动态的而不是固定的,就需要将这个子节点内数据当做一个字符串来解析并映射到实体的一个属性上,查阅资料后才找到一种解决办法。

目前的解决途径

通过目标字段增加@XmlJavaTypeAdapter自定义xml到java类型的适配器来实现,话不多说,上代码

实体类

package org.example;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

/**
 * @Title: Company
 * @Package org.example
 * @Description: TODO
 * @Author MYF
 * @Date 2022/12/1 21:24
 * @Version V1.0
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Company {

    private String businessName;

    private String orgType;

    @XmlJavaTypeAdapter(CustomAdapter.class)
    private String legalExt;

    public String getBusinessName() {
        return businessName;
    }

    public void setBusinessName(String businessName) {
        this.businessName = businessName;
    }

    public String getOrgType() {
        return orgType;
    }

    public void setOrgType(String orgType) {
        this.orgType = orgType;
    }

    public String getLegalExt() {
        return legalExt;
    }

    public void setLegalExt(String legalExt) {
        this.legalExt = legalExt;
    }
}

自定义xml到java类型的适配器

本例中只实现了xml到java类型的转换也就是下放代码中的 unmarshal 方法

package org.example;

import org.w3c.dom.Element;

import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;

/**
 * @Title: CustomAdapter
 * @Package org.example
 * @Description: TODO
 * @Author MYF
 * @Date 2022/12/1 21:26
 * @Version V1.0
 */
public class CustomAdapter extends XmlAdapter<Object, String> {
    @Override
    public String unmarshal(Object xmlObj) throws Exception {
        Element element = (Element)xmlObj;
        TransformerFactory transFactory = TransformerFactory.newInstance();
        Transformer transformer = transFactory.newTransformer();
        StringWriter buffer = new StringWriter();
        /**是否省略xml的头部声明**/
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        /**转换成字符串时应用的编码**/
        transformer.setOutputProperty(OutputKeys.ENCODING, StandardCharsets.UTF_8.name());
        /**可以理解为压缩xml,不美化格式**/
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "0");
        transformer.transform(new DOMSource(element),
                new StreamResult(buffer));
        String xmlStr = buffer.toString();
        return xmlStr;
    }

    @Override
    public Object marshal(String v) throws Exception {
        return v;
    }
}

测试类

注:本例中测试xml中的数据为假数据

package org.example;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.Reader;
import java.io.StringReader;

public class TestXmlTransform {
    public static void main(String[] args) throws Exception {
        /**
         * 示例xml结构如下,其中legalExt下为
         * <company>
         *     <businessName>北京神宇科技公司</businessName>
         *     <orgType>02</orgType>
         *     <legalExt>
         *         <legalName>赵公子</legalName>
         *         <legalType>自然人</legalType>
         *         <legalIdCard>假装身份证号</legalIdCard>
         *         <dynamicKey1>dynamicVal1</dynamicKey1>
         *         <dynamicKey2>dynamicVal2</dynamicKey2>
         *         <dynamicKeyN>dynamicValN</dynamicKeyN>
         *     </legalExt>
         * </company>
         * 其中dynamicKey1~dynamicKeyN为动态标签,可能随实际业务不同而不同
         * **/
        String xmlStr = "<company><businessName>北京神宇科技公司</businessName><orgType>02</orgType><legalExt><legalName>赵公子</legalName><legalType>自然人</legalType><legalIdCard>假装身份证号</legalIdCard><dynamicKey1>dynamicVal1</dynamicKey1><dynamicKey2>dynamicVal2</dynamicKey2><dynamicKeyN>dynamicValN</dynamicKeyN></legalExt></company>";
        Reader reader = null;
        JAXBContext context = JAXBContext.newInstance(Company.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        reader = new StringReader(xmlStr);
        Company company = (Company)unmarshaller.unmarshal(reader);
        System.out.println(company.getLegalExt());
        if (reader != null) {
            reader.close();
        }
    }
}

测试类执行结果
实际代码输出为一行,为方便贴图借用hutoo的XmlUtil格式化了一下
在这里插入图片描述

最后

以上的代码已经打包到CSDN—→传送门
时间有限没在继续寻找更好的解决方案,如有更好的解决方式还望各位朋友留言相告!
PS:第一次编写这种文章,各位浅喷~

JAXB深度解析:Java XML数据绑定核心机制与实战优化 数据绑定是解决不同数据格式间转换的关键技术,其核心原理在于建立数据模型与特定格式(如XML)之间的映射关系。在Java生态中,JAXB(Java Architecture for XML Binding)作为官方标准,通过注解驱动和约定优于配置的设计哲学,实现了Java对象与XML文档的高效、类型安全互转。这项技术的核心价值在于,它让开发者能以操作熟悉POJO的方式处理结构化XML数据,彻底摆脱手动拼接或解析字符串的低效与易错,极大提升了开发效率和系统可维护性。其典型应用场景广泛存在于金融、电信等传统行业的 阅读详情

相关推荐

JAXB实战:Java与XML数据绑定的核心原理与应用场景

数据序列化与反序列化是系统间数据交换的基础技术,它实现了内存对象与持久化格式之间的双向转换。其核心原理在于通过预定义的规则或契约,将结构化数据映射为编程语言中的对象模型,从而屏蔽底层格式解析的复杂性。在Java生态中,JAXB(Java Architecture for XML Binding)作为一项标准技术,专门用于实现Java对象与XML文档之间的自动绑定。它的技术价值在于提供了基于注解的声明式编程模型,开发者只需在POJO上添加注解,JAXB运行时便能自动处理编组(Marshal)与解组(Unmar

chenshixi3325的博客 378

JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素

JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素

听海边涛声 1996

Java字符串与XML文档互转:4种方案深度对比与生产实践

XML文档是遵循W3C规范的树状内存结构,而字符串仅是无约束的字符序列;二者转换本质是文本解析与DOM模型构建的过程。其核心原理涉及字符编码识别、命名空间处理、实体解析及安全防护(如XXE防御)。技术价值在于支撑微服务通信、政务系统对接、医疗HL7消息等强XML依赖场景,保障数据完整性与接口稳定性。实际应用中需权衡JDK内置DOM的零依赖优势、DOM4J的API简洁性、JAXB的Schema类型安全,以及Jackson XML在Spring Boot中的JSON/XML双协议兼容性。本文聚焦Java生态下S

weixin_32578161的博客 296

Java 解析嵌套xml字符串,获取指定节点值

Java 解析嵌套xml字符串,获取指定节点值

weixin_44021888的博客 1373

MLX90640 热成像 STM32

MLX90640 热成像

zhaocundang's blog 4990

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 477

java xml嵌套循环,Java HTML/XML - 如何使用JAXB解组xml项的嵌套列表

import java.io.StringReader;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unm...

weixin_33492955的博客 566

FPGA高速通信双核解析:CMAC与Interlaken硬核的实战对比

本文深入对比了FPGA中两大高速通信硬核CMAC与Interlaken的核心差异与应用场景。CMAC作为标准以太网接入方案,适用于网卡、交换机等需对外互联的场景;而Interlaken则以极低延迟和高效通道化能力,专为芯片间、板间裸数据高速传输设计。文章通过实战案例与性能指标分析,为FPGA高速通信方案选型提供清晰指南。

f9g0h的博客 833

用JAXB生成一个XML文档

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明作者:Deepak Vohra;simmone原文地址:http://www.onjava.com/pub/a/onjava/2004/12/15/jaxb.html中文地址:http://www.matrix.org.cn/resource/article/43/43889_JAXB.html关键词: JAXB X

张皓的专栏 4481

网红商品数据抓取:基于Python的高效爬虫实战

本篇博客介绍了从爬取到存储、分析和可视化网红商品数据的完整流程。通过Python的强大生态,我们能够轻松完成复杂的数据抓取任务。在实际应用中,还可以将此爬虫与机器学习模型结合,进一步挖掘数据价值。

2201_76125261的博客 1472

1 初识智能化测试

非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。

Criss@陈磊 2616

java jaxb解析xml_java 解析xml JAXB 嵌套

packagedemon;importjavax.xml.bind.JAXBContext;importjavax.xml.bind.JAXBException;importjavax.xml.bind.Marshaller;importjavax.xml.bind.Unmarshaller;importjava.io.StringReader;importjava.io.StringWriter...

weixin_30771489的博客 250

5、模型预测控制与分布式MPC控制结构解析

本文深入解析了模型预测控制(MPC)中的双模式预测控制及其稳定性理论,并探讨了分布式MPC的不同控制结构。内容涵盖MPC的基本公式化、性能指标、优化问题以及相关算法步骤,同时比较了集中式MPC、单层分布式MPC和分层分布式MPC的优缺点和适用场景。最后通过流程图和表格形式总结了双模式MPC的算法步骤和控制结构选择思路,并提供了操作建议,以帮助在实际工业系统中更好地应用MPC技术。

tea88的博客 164

java xml jaxb_java 解析xml JAXB 嵌套

packagedemon;importjavax.xml.bind.JAXBContext;importjavax.xml.bind.JAXBException;importjavax.xml.bind.Marshaller;importjavax.xml.bind.Unmarshaller;importjava.io.StringReader;importjava.io.StringWriter...

weixin_39549899的博客 271

PostgreSQL 异常排查:读取流时发生异常 (x80004005)

通过以上步骤,您应该能够解决在 .NET Core 中与 PostgreSQL 数据库进行交互时出现异常 (x80004005) 的问题。确保数据库连接正确,查询语句准确,并使用兼容的驱动程序版本。如有必要,可以捕获异常并查看详细的错误信息,以便更好地排查问题。在使用 .NET Core 开发应用程序时,如果在与 PostgreSQL 数据库进行交互时遇到异常,例如在读取数据流时发生异常 (x80004005),我们需要进行排查和修复。另外,还可以尝试捕获异常并打印异常信息,以便更好地了解问题所在。

XwlyVue的博客 1613

AI人工智能与数据挖掘的技术融合趋势

我们的目的是搞清楚AI人工智能和数据挖掘是怎么融合在一起的,以及这种融合未来会有什么样的发展趋势。范围涵盖了这两种技术融合的原理、应用场景,还有未来可能面临的挑战。我们会先讲讲AI人工智能和数据挖掘是什么,它们之间有什么关系。然后说说它们融合的算法原理、数学模型。接着通过一个实际的项目案例,看看它们是怎么在实际中运用的。还会介绍一些它们的应用场景和相关工具。最后分析一下未来的发展趋势和挑战,并且总结学到的知识,提出一些思考题让大家思考。AI人工智能。

AI 领航者的博客 1361

jaxb解析字符串xml_一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)的枚举

jaxb解析字符串xml 尽管用于XML绑定的Java体系结构 ( JAXB )在名义情况下(尤其是自Java SE 6以来) 相当容易使用,但它也存在许多细微差别。 一些常见的细微差别是由于无法将 XML架构定义 (XSD)类型与Java 类型精确匹配 ( 绑定 )。 这篇文章看一个具体的例子,它还演示了当JAXB编译器生成Java类时,实施相同XML结构的不同XSD构造如何导致不同的Jav...

最佳 Java 编程 525

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JAXB处理XML与对象互转

本文主要讲解JAXB来处理对象与XML进行互转。 其中关于CDATA数据的处理参考:Jaxb如何优雅的处理CData这篇文章的实现,并略作改动。

请叫我猿叔叔的博客 1005

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAXB实现xml到bean录入数据库

jaxb xml字符串与bean的转换

Prf_Nie的博客 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAXB解析xml

JAXB解析xml真是非常的方便,只需在对象上加上注解,标注对应xml文件的节点即可。很方便。下面是一个示例。封装解析用到的代码,提供三个方法,一个是将字符串解析为对象,一个是读取一个xml文件解析,另一个是将输入流解析为对象。package cn.com.servyou.hs.support.core.util; import lombok.extern.slf4j.Slf4j; import j

alwaysBrother的博客 2377

一文看懂Java对XML文件序列化与反序列化解析教程(小白版)

本文介绍了Java中XML文件序列化与反序列化的基础知识和实现方法。主要内容包括:XML的基本概念和结构,Java处理XML的常用方式(重点介绍JAXB和Jackson XML),以及JAXB的核心注解使用。通过详细的代码示例,演示了如何实现简单Java对象到XML的转换(序列化)以及XML到Java对象的转换(反序列化),适合Java初学者快速掌握XML数据处理的入门技能。

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1638

java 字符串转xml对象

从Java字符串转换为XML对象 在软件开发中,XML(可扩展标记语言)被广泛用于数据交换和存储。在Java中,有时我们需要将一个字符串转换为XML对象以便进行进一步的操作,比如解析XML内容或者生成XML文件。本文将介绍如何使用Java来实现这一过程。 XML简介 XML是一种标记语言,用于描述数据的结构和内容。它由一系...

weixin_41389782的博客 727

jaxb_一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)

jaxb 尽管用于XML绑定的Java体系结构( JAXB )在名义情况下(尤其是自Java SE 6以来) 相当容易使用,但它也带来了许多细微差别。 一些常见的细微差别是由于无法将XML架构定义(XSD)类型与Java类型精确匹配(绑定)。 这篇文章看一个具体的例子,它还演示了当JAXB编译器生成Java类时,实施相同XML结构的不同XSD构造如何导致不同的Java类型。 下一个代码清单(用...

cunfen3485的博客 243

一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)

尽管用于XML绑定的Java体系结构 ( JAXB )在名义情况下(尤其是自Java SE 6以来) 相当容易使用,但它也存在许多细微差别。 一些常见的细微差别是由于无法将 XML模式定义 (XSD)类型与Java 类型精确匹配 ( 绑定 )。 这篇文章看一个具体的例子,它还演示了当JAXB编译器生成Java类时,实施相同XML结构的不同XSD构造如何导致不同的Java类型。 下一个代码...

最佳 Java 编程 368

Java工具12-Java序列化与反序列化:JSON与XML全面解析与实战

Java序列化与反序列化:JSON与XML全面解析与实战 本文深入探讨Java中JSON与XML两种主流数据格式的序列化技术。JSON以轻量、简洁见长,适合REST API和移动应用;XML则凭借严谨结构和验证能力,适用于企业级数据交换。 核心对比: JSON语法简洁,基于键值对;XML结构严谨,使用标签 JSON体积更小,传输效率高;XML支持严格验证和命名空间 JSON适合简单到中等复杂度数据;XML擅长处理复杂嵌套结构 实战部分: 详细演示Jackson和Gson库处理JSON的序列化/反序列化 提供

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
下一篇: 麒麟V10(arm)配置本地离线yum源
myfm2java
博客等级 码龄11年 15粉丝 2原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值