【问题标题】:SimpleXML Path annotation ignoredSimpleXML 路径注释被忽略
【发布时间】: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


【解决方案1】:

简单的解决方案:

    @field:Path("firstlevel/secondlevel")
    @param:Path("firstlevel/secondlevel")

这声明了基于 java 的框架的注解

【讨论】:

    【解决方案2】:

    不是这个

    @field:Element(name = "testelement", required = false)
    @param:Element(name = "testelement", required = false)
    @Path("firstlevel/secondlevel")
    var testelement: String? = null,
    

    试试这个

    @field:Element(name = "testelement", required = false)
    @param:Element(name = "testelement", required = false)
    @field:Path("firstlevel/secondlevel")  <=========================
    var testelement: String? = null,
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2012-05-19
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多