如何使用Jackson解析含属性与文本内容的XML文档?
解决Jackson XML解析混合属性与文本的元素问题
要正确解析你提供的XML文档,需要调整数据类的注解和字段定义,核心是处理**
步骤1:修正Two数据类
原来的Two类只定义了id字段,且未标记为XML属性,也没有捕获元素文本的字段。修改如下:
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText data class Two( // 标记id为XML属性,设为可空(第二个<two>无id) @JacksonXmlProperty(isAttribute = true) val id: String?, // 捕获<two>元素本身的文本内容,设为可空(第一个<two>无文本) @JacksonXmlText val text: String? )
步骤2:调整One数据类(可选但推荐)
为确保Jackson直接解析多个<two>元素而不添加外层包装标签,给列表字段加上@JacksonXmlElementWrapper(useWrapping = false):
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper data class One( @JacksonXmlElementWrapper(useWrapping = false) val two: List<Two> )
测试解析代码
使用XmlMapper进行解析验证:
import com.fasterxml.jackson.dataformat.xml.XmlMapper fun main() { val xmlMapper = XmlMapper() val xmlContent = """ <one> <two id="X"></two> <two>Text</two> </one> """.trimIndent() val result = xmlMapper.readValue(xmlContent, One::class.java) println("第一个<two>:id=${result.two[0].id},text=${result.two[0].text}") println("第二个<two>:id=${result.two[1].id},text=${result.two[1].text}") }
输出结果:
第一个<two>:id=X,text=null 第二个<two>:id=null,text=Text
关键说明
- 必须用
@JacksonXmlProperty(isAttribute = true)标记id字段,否则Jackson会把它当作子元素而非属性解析 @JacksonXmlText专门用于捕获XML元素自身的文本内容,而非子标签的文本- 把
id和text设为可空类型(String?),才能兼容缺失属性或文本的<two>元素
内容的提问来源于stack exchange,提问作者user8681
相关产品推荐
相关产品推荐

