使用jaxb来生成多层嵌套xml

问题

需要生成多层嵌套xml,类似如下内容:

xml 复制代码
<A>
    <B>
        <C>
            <!-- C类的字段 -->
        </C>
        <C>
            <!-- 另一个C类的字段 -->
        </C>
    </B>
</A>

解决

C.java

java 复制代码
import jakarta.xml.bind.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class C {
    @XmlElement(nillable = true)
    private String field1;

    @XmlElement(nillable = true)
    private String field2;
}

这里使用到了lombok。注意这里需要设置@XmlAccessorType(XmlAccessType.FIELD)不然会出现:JAXB IllegalAnnotationException is thrown during parsing XML错误。

B.java

java 复制代码
import jakarta.xml.bind.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class B {
    @XmlElement(name = "C")  // 指定 XML 标签名称
    private List<C> cList;
}

这里设置了一个数组标签。

A.java

java 复制代码
import jakarta.xml.bind.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
    @XmlElement(name = "B")  // 指定 XML 标签名称
    private B b;
}

这里是根xml,所以,这里需要设置@XmlRootElement注解。

使用

java 复制代码
	...
	StringWriter xmlWriter = new StringWriter();
    marshaller.marshal(uniteWorkReq, new StreamResult(xmlWriter));

    String xml = xmlWriter.toString();
    ...

配置,依旧是如下方式注入:

java 复制代码
@Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        // this package must match the package in the <generatePackage> specified in
        // pom.xml
//        marshaller.setContextPath("com.cmdi.system.wsdl");
        marshaller.setPackagesToScan("com.xxx.xxxx.wsdl");

        return marshaller;
    }

参考

相关推荐
tianyuanwo15 天前
深入解析 RISC-V 虚拟化中的 UEFI 固件配置:从 XML 到 NVRAM 的生命周期管理
xml·linux·risc-v
糖果店的幽灵17 天前
软件测试接口测试从入门到精通:常见接口类型与数据格式
xml·软件测试·json·接口测试·数据格式
摇滚侠18 天前
SpringMVC 入门到实战 配置类替换 XML 配置文件 86-91
xml·java·后端·spring·maven·intellij-idea
就叫_这个吧19 天前
IDEA Mybatis xml文件,实现sql语句联想,自动填入补充
xml·mysql·intellij-idea·mybatis
范什么特西19 天前
配置文件xml和properties
xml·前端
曹牧20 天前
Oracle:xml转义
xml·数据库·oracle
曹牧20 天前
Java:XML转义
xml·java·开发语言
摇滚侠20 天前
Spring 零基础入门到进阶 基于注解管理 Bean 38-43
xml·java·后端·spring·intellij-idea
San813_LDD21 天前
[深度学习] 数据序列化格式对比:以日志级别配置为例
xml·java·前端
摇滚侠21 天前
Spring 零基础入门到进阶 基于 XML 的声明式事务 71
xml·数据库·spring