【发布时间】:2023-03-22 09:57:01
【问题描述】:
我想知道 simplexml 中的 @Path 注释如何在 Android 上为 kotlin 工作(或者如果它完全可以工作更好)。
给定的 XML 将演示问题
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<start >
<one>never</one>
<firstlevel>
<secondlevel>
<one>always</one>
<testelement>1</testelement>
<testlist>
<title>1</title>
<active>false</active>
</testlist>
<testlist>
<title>2</title>
<active>false</active>
</testlist>
<testlist>
<title>3</title>
<active>false</active>
<testobject>
<testbyte>127</testbyte>
</testobject>
</testlist>
</secondlevel>
</firstlevel>
</start>
和对象
@Root(name = "start", strict = false)
data class Baseobj constructor(
@field:ElementList(name = "testlist", inline = true, required = false)
@param:ElementList(name = "testlist", inline = true, required = false)
@Path("firstlevel/secondlevel")
var testlist: List<testlist>? = listOf(),
@field:Element(name = "testelement", required = false)
@param:Element(name = "testelement", required = false)
@Path("firstlevel/secondlevel")
var testelement: String? = null,
@Path("firstlevel/secondlevel")
@field:Element(name = "one", required = false)
@param:Element(name = "one", required = false)
var one: String? = null
)
对应的类
@Root(strict = false, name = "testlist")
data class testlist constructor(
@field:Element(required = false, name = "title")
@param:Element(required = false, name = "title")
var title: String? = null,
@field:Element(required = false, name = "active")
@param:Element(required = false, name = "active")
var active: String? = null
)
通过测试
@Test
fun should_ParseTestXML() {
val serializer = Persister()
val stream = javaClass.getResourceAsStream("/raw/test.xml")
val base = serializer.read(Baseobj::class.java, stream)
println("Here we are: ${base.testelement} ${base.one}")
}
会打印出"Here we are: null never",这不是预期的或——至少——不是预期的行为。 SimpleXML 包含在改造包中
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-jackson:2.4.0'
implementation('com.squareup.retrofit2:converter-simplexml:2.4.0') {
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
exclude group: 'xpp3', module: 'xpp3'
}
在我当前的项目中,xml 更为复杂,对象结构不应包含包装对象。尽管我知道存在转换器,但我希望有一个基于 XPath 用法的解决方案。
提前谢谢你
迈克尔
【问题讨论】:
-
如果在 Java 中声明这些类,结果会改变吗?
-
是的,Java 实现完美无缺。
标签: android xml xpath kotlin simple-framework