用Jackson和Kotlin反序列化xml名称空间

时间:2019-05-27 02:26:27

标签: xml kotlin jackson jackson-dataformat-xml

我有一个带有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时,我收到一条错误消息,指出两个名称空间都应该可以为空。

我已经尝试过在类的主体中使用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,并使它们相同?

2 个答案:

答案 0 :(得分:0)

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

因此,您不得定义与这些属性相对应的POJO属性。 而是使用@JacksonXmlPropertynamespace参数。 因此,您的Person类将看起来像这样:

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

答案 1 :(得分:0)

我解决了这样的问题,将属性设置为XMLInputFactory就像这样:

JSON Object

在这种情况下,您可以对所有名称空间建模并执行所需的操作。 案件解决了。