XML 相关技术总结
Posted moretime software
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML 相关技术总结相关的知识,希望对你有一定的参考价值。
本文讲解如何生成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.8
compile 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 wrappingList
andMap
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.SerializationFeature
import com.fasterxml.jackson.dataformat.xml.XmlMapper
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
import 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 相关技术总结的主要内容,如果未能解决你的问题,请参考以下文章
在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途