【问题标题】:Deserializing xml namespaces with Jackson & Kotlin使用 Jackson 和 Kotlin 反序列化 xml 命名空间
【发布时间】:2019-10-12 14:40:06
【问题描述】:

我有一个带有 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 并使它们相同?

【问题讨论】:

    标签: xml kotlin jackson jackson-dataformat-xml


    【解决方案1】:

    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
    )
    

    【讨论】:

    • 感谢 Thomas,但如果我将 xml 写回,ns0 命名空间将会消失。我不控制 xml,我需要它具有相同的命名空间。
    • 在您的 XML 输入示例中,ns0 命名空间前缀没有在任何地方使用。因此,它不会出现在 XML 输出中并不重要。如果 XML 输入实际使用它(例如 &lt;ns0:name&gt;John&lt;/ns0:name&gt;),那么它也会出现在 XML 输出中。
    • 我明白,在我的情况下购买目标系统需要 ns(因为有一个包含 ns 的属性(例如&lt;name type="ns0:something"&gt;John&lt;/name&gt;)。我知道这对 xml 没有意义,但我无法控制源xml或目标系统的需求。有没有办法强制ns尽管没有使用?
    【解决方案2】:

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

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

    在这种情况下,您可以对所有命名空间进行建模并做您想做的事情。 案件已解决。

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2015-11-03
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多