使用 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 属性。
相反,您使用 @JacksonXmlProperty
的 namespace
参数。
所以你的 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())
}
在这种情况下,您可以对所有命名空间建模并执行您想要的操作。
破案了。
我有一个带有 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 属性。
相反,您使用 @JacksonXmlProperty
的 namespace
参数。
所以你的 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())
}
在这种情况下,您可以对所有命名空间建模并执行您想要的操作。 破案了。