搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > moretime software > XML 相关技术总结

XML 相关技术总结

moretime software 2020-06-28

本文讲解如何生成XML的相关技术。

调包

作为调包侠,要调就调最好的包。像 fastjson[1],我第一次听说这个库有漏洞,得强制升级,这个事情在2019年。然后我一查,2017年就有个差不多的漏洞。然后最近又有 Fastjson 被曝出“高危”远程代码执行漏洞[2]
关于 json,我只用 Spring 用的 ObjectMapper[3]。这个项目叫 jackson[4]。当然,这个项目也有 XML 相关的类库,名为 XmlMapper[5]

XML

先介绍一下 XML 是啥。XML 全称是 Extensible Markup Language。总之就是个标记语言
长这样

<note author="yy"><to>Tove</to><from>Jani</from><heading>Reminder</heading><body> <msg> Don't forget me this weekend! </msg> </body></note>

改自 w3schools xml example[6]
之后介绍几个术语

标签 <to> </to> 这是标签元素 <to>Tove</to> 整个是元素属性 author="yy" 这个是属性

XmlMapper


依赖

compile com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.8compile com.fasterxml.jackson.module:jackson-module-kotlin:2.11.0


用法

val xmlMapper = XmlMapper().registerKotlinModule()xmlMapper.enable(SerializationFeature.INDENT_OUTPUT)val xml = xmlMapper.writeValueAsString(your_object)

第2行是加上换行的功能,默认不换行。大体上跟 ObjectMapper 用法一样。kotlin的写法和 Java 略有不同。如果不写 registerKotlinModule() 会有问题

注解

对象转JSON看上去很简单,但是XML上面的标签名和属性这个怎么弄?肯定得附加更多的信息来定制。这时就要用到相关的注解。
有5个,摘自 jackson-dataformat-xml additional-annotations[7]

@JacksonXmlElementWrapper allows specifying XML element to use for wrapping List and Map properties@JacksonXmlProperty allows specifying XML namespace and local name for a property; as well as whether property is to be written as an XML element or attribute.@JacksonXmlRootElement allows specifying XML element to use for wrapping the root element (default uses 'simple name' of the value class)@JacksonXmlText allows specifying that value of one property is to be serialized as "unwrapped" text, and not in an element.@JacksonXmlCData allows specifying that the value of a property is to be serialized within a CData tag.


这里介绍2个
@JacksonXmlRootElement(localName = "") 
这个作用于根元素,可以将跟标签的内容 localName。默认是类名。
@JacksonXmlProperty(localName = "") 
这个作用于字段,可以将字段的标签换为 localName
@JacksonXmlProperty(isAttribute = true)
如果用了这个,就不会设置为子元素,而是属性名

Sample

最后看看class 怎么写才能生成上文的 XML。

package com.example
import com.fasterxml.jackson.databind.SerializationFeatureimport com.fasterxml.jackson.dataformat.xml.XmlMapperimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlPropertyimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElementimport com.fasterxml.jackson.module.kotlin.registerKotlinModule
data class Body ( @JacksonXmlProperty(localName = "MSG") val msg: String)
@JacksonXmlRootElement(localName = "note")data class Note ( @JacksonXmlProperty(localName = "Author", isAttribute = true) val author: String, @JacksonXmlProperty(localName = "To") val to: String, @JacksonXmlProperty(localName = "From") val from: String, @JacksonXmlProperty(localName = "Heading") val heading: String, @JacksonXmlProperty(localName = "Body") val body: Body)
fun main() { val note = Note( author = "yy", to = "Tove", from = "Jani", heading = "Reminder", body = Body( msg = "Don't forget me this weekend!Don't forget me this weekend!" ) )
val xmlMapper = XmlMapper().registerKotlinModule() xmlMapper.enable(SerializationFeature.INDENT_OUTPUT) println(xmlMapper.writeValueAsString(note))}


具名参数[8] 还很优雅的。
输出:

完。

References

[1] fastjson: https://github.com/alibaba/fastjson
[2] Fastjson 被曝出“高危”远程代码执行漏洞: https://www.infoq.cn/article/jNdRHv6FxZAS32X8IMfK
[3] ObjectMapper: https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/ObjectMapper.html
[4] jackson: https://github.com/FasterXML/jackson
[5] XmlMapper: https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.7/com/fasterxml/jackson/dataformat/xml/XmlMapper.html
[6] w3schools xml example: https://www.w3schools.com/xml/note.xml
[7] jackson-dataformat-xml additional-annotations: https://github.com/FasterXML/jackson-dataformat-xml#additional-annotations
[8] 具名参数: https://kotlinlang.org/docs/reference/functions.html#named-arguments


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《XML 相关技术总结》的版权归原作者「moretime software」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注moretime software微信公众号

moretime software微信公众号:gh_8303d1e3b4e0

moretime software

手机扫描上方二维码即可关注moretime software微信公众号

moretime software最新文章

精品公众号随机推荐