首页 > 解决方案 > Jackson XmlMapper 在将 XML 写入文件时强制使用小写标记名称

问题描述

我在尝试使用 XmlMapper 从 POJO 写入 XML 文件时遇到问题。即使我使用的是 JacksonXmlProperty(localname ="UPPERCASE"),XmlMapper 也会强制使用小写标签名称

这是我映射的 POJOS 的代码

项目 XML:

data class ItemXML(
    @JacksonXmlProperty(localName = "ITEMTYPE") val itemType: String,
    @JacksonXmlProperty(localName = "ITEMID") val itemId: String,
    @JacksonXmlProperty(localName = "QTY") val qty: Int,
    @JacksonXmlProperty(localName = "COLOR") val color: Int,
    @JacksonXmlProperty(localName = "EXTRA") val extra: String,
    @JacksonXmlProperty(localName = "ALTERNATE") val alternate: String,
    @JacksonXmlProperty(localName = "MATCHID") val matchId: Int,
    @JacksonXmlProperty(localName = "COUNTERPART") val counterpart: String
)

库存XML

@JacksonXmlRootElement(localName = "INVENTORY")
data class InventoryXML(
    @JacksonXmlProperty(localName = "ITEM")
    @JacksonXmlElementWrapper(useWrapping = false)
    val item: List<ItemXML>
)

以下是将 XML 写入放置在 OnCreate() 方法中的文件的代码:

inventoryXml = xmlMapper.readValue(data, InventoryXML::class.java)

pathFile = filesDir.absolutePath + "/inventory.xml"

xmlMapper.writeValue(File(pathFile), inventoryXml)

这是已保存的文件(如您所见,只有 INVENTORY 标记已保存为大写)

<INVENTORY>
  <item>
    <alternate>N</alternate>
    <color>0</color>
    <counterpart>N</counterpart>
    <extra>N</extra>
    <itemid>old012</itemid>
    <itemtype>M</itemtype>
    <matchid>0</matchid>
    <qty>1</qty>
  </item>
  <item>
    <alternate>N</alternate>
    <color>11</color>
    <counterpart>N</counterpart>
    <extra>N</extra>
    <itemid>3430c02</itemid>
    <itemtype>P</itemtype>
    <matchid>0</matchid>
    <qty>1</qty>
  </item>
</INVENTORY>

这段代码有什么问题?我希望将标签保存为 JacksonXmlProperty 的 localName 属性中指定的内容。

标签: javaandroidxmlkotlinjackson

解决方案


重命名属性以遵循标准 Bean 命名约定,即驼峰式命名,因为这是 Jackson 所期望的:

项目 XML:

data class ItemXML(
    @JacksonXmlProperty(localName = "ITEMTYPE") val itemType: String,
    @JacksonXmlProperty(localName = "ITEMID") val itemId: String,
    @JacksonXmlProperty(localName = "QTY") val qty: Int,
    @JacksonXmlProperty(localName = "COLOR") val color: Int,
    @JacksonXmlProperty(localName = "EXTRA") val extra: String,
    @JacksonXmlProperty(localName = "ALTERNATE") val alternate: String,
    @JacksonXmlProperty(localName = "MATCHID") val matchId: Int,
    @JacksonXmlProperty(localName = "COUNTERPART") val counterpart: String
)

库存XML

@JacksonXmlRootElement(localName = "INVENTORY")
data class InventoryXML(
    @JacksonXmlProperty(localName = "ITEM")
    @JacksonXmlElementWrapper(useWrapping = false)
    val item: List<ItemXML>
)

推荐阅读