You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:12:47