SimpleXML Path аннотация игнорируется - PullRequest
0 голосов
/ 27 мая 2018

Мне интересно, как аннотация @Path из simplexml работает для kotlin на Android (или лучше, если он вообще работает).

Данный 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.

Заранее спасибо

Майкл

1 Ответ

0 голосов
/ 03 июня 2018

Простое решение:

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

Это объявление аннотации для фреймворков на основе Java

...