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.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 相关技术总结的主要内容,如果未能解决你的问题,请参考以下文章

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

java 怎么接收第三方传过来的xml

片段与另一个片段重叠

常用的项目中使用的技术经验总结(不断补充中)

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException

需要示例代码片段帮助