使用 Jackson 和 Kotlin 反序列化 xml 个命名空间

Deserializing xml namespaces with Jackson & Kotlin

我有一个带有 2 个命名空间的 xml 元素,我无法用 jackson 读取它们。

<Person xmlns="http://some.namespace.com" xmlns:ns0="http://some.other.namespace.com">
    <name>John</name>
</Person>
internal data class Person(
    val name: String,
    @get:JacksonXmlProperty(isAttribute = true)
    val xmlns: String,
    @get:JacksonXmlProperty(isAttribute = true, localName="xmlns:ns0")
    val ns0: String
)

使用 jackson 读取 XML 时,我收到一条错误消息,指出两个名称空间都应该可以为空。

我已经尝试在 class 的正文中使用一些变体,例如 attrs 和名称空间属性,例如

    @JacksonXmlProperty(isAttribute = true, localName = "ns0", namespace = "xmlns")
    var ns0: String? = null

这是我正在使用的映射器

val mapper: XmlMapper = XmlMapper().apply {
        registerModule(KotlinModule())
        setSerializationInclusion(JsonInclude.Include.NON_NULL)
    }

我怎样才能再次读写这个xml并使它们完全相同?

XML参数xmlns="...."xmlns:prefix="...." 是 XML 命名空间定义。它们不是 XML 属性, 即使他们看起来像这样。

因此,您不能定义与这些对应的POJO 属性。 相反,您使用 @JacksonXmlPropertynamespace 参数。 所以你的 Person class 看起来像这样:

internal data class Person(
    @get: JacksonXmlProperty(isAttribute=true, localName="name", namespace="http://some.namespace.com")
    val name: String
)

我解决了将 属性 设置为 XMLInputFactory 的问题,如下所示:

val inputFactory = XMLInputFactory.newFactory()
inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, false)
XmlMapper(inputFactory).apply {
   registerModule(KotlinModule())
}

在这种情况下,您可以对所有命名空间建模并执行您想要的操作。 破案了。