使用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;
    }

参考

相关推荐
乌夷4 小时前
将 Java 对象自动转换为 XML 字符串
xml·java·开发语言
乌夷12 小时前
springboot 接口接收及响应xml数据
xml·spring boot·后端
草明14 小时前
AndroidManifest.xml 文件中的 package 属性不再是强制要求定义
android·xml·react native
码农研究僧19 小时前
详细分析Mybatis中的动态Sql(附Demo)
xml·java·数据库·sql·mybatis
TracyGC19 小时前
coco(json)、yolo(txt)、voc(xml)标注格式的相互转换
xml·yolo·json
软糖工程0011 天前
XML简介
xml·前端·学习
liguiyuan1123 天前
目标检测任务中xml标签文件修改
xml·目标检测·xml标签修改
hirolee883 天前
maven 和pom.xml 中的npm 添加代理配置
xml·java·maven
ededabo4 天前
python/爬虫技术/lxml工具介绍/XML和HTML解析
xml·爬虫·python